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.
299 lines
10 KiB
299 lines
10 KiB
//=========== Copyright Valve Corporation, All rights reserved. ===============// |
|
// |
|
// Purpose: |
|
//=============================================================================// |
|
|
|
#ifndef UITOPLEVELWINDOW_H |
|
#define UITOPLEVELWINDOW_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "utlstring.h" |
|
#include "utlmap.h" |
|
#include "utllinkedlist.h" |
|
#if !defined( SOURCE2_PANORAMA ) |
|
#include "constants.h" |
|
#include "globals.h" |
|
#endif |
|
#include "reliabletimer.h" |
|
#if !defined( SOURCE2_PANORAMA ) |
|
#include "framefunction.h" |
|
#endif |
|
#include "input/iuiinput.h" |
|
#include "input/mousecursors.h" |
|
#include "iuiengine.h" |
|
#include "color.h" |
|
#include "uievent.h" |
|
#include "iuiwindow.h" |
|
#include "iuirenderengine.h" |
|
#include "uipanel.h" |
|
|
|
namespace panorama |
|
{ |
|
|
|
class CUIRenderEngine; |
|
class CPanel2D; |
|
class CUIWindowInput; |
|
class CUIEngine; |
|
class CMouseCursorTexture; |
|
class CImageResourceManager; |
|
class CFastScrollSoundManager; |
|
class IUI3DSurface; |
|
class CMouseCursorRender; |
|
|
|
|
|
// |
|
// Top level window class |
|
// |
|
class CTopLevelWindow : public panorama::IUIWindow |
|
{ |
|
public: |
|
CTopLevelWindow( CUIEngine *pUIEngineParent ); |
|
virtual ~CTopLevelWindow(); |
|
|
|
// Delete the window object |
|
virtual void Delete() OVERRIDE{ delete this; } |
|
|
|
// Final step of initialization, post constructor, and post BInitializeSurface() on individidual window type |
|
virtual bool FinishInitialization(); |
|
|
|
// Run any per window frame func logic |
|
virtual void RunPlatformFrame(); |
|
|
|
// Set scaling factor that applies to all x/y values in the UI for the window, used so we can |
|
// author content at say 1080p but pass 0.6666666f for this to render in 720p on cards with poor |
|
// fill rates or TVs without 1080p support. |
|
virtual void SetUIScaleFactor( float flScaleFactor ) OVERRIDE; |
|
virtual float GetUIScaleFactor() OVERRIDE { return m_flScaleFactor; } |
|
|
|
// Window position/activation management |
|
const char * GetTargetMonitor() { return m_strTargetMonitor.String(); } |
|
virtual void GetWindowBounds( float &left, float &top, float &right, float &bottom ) = 0; |
|
virtual void GetClientDimensions( float &width, float &height ) OVERRIDE = 0; |
|
|
|
virtual bool BAllowInput( InputMessage_t &msg ); |
|
|
|
// Access the rendering interface you use to draw onto this window |
|
virtual IUIRenderEngine * UIRenderEngine() OVERRIDE{ return (IUIRenderEngine*)m_pRenderEngine; } |
|
CUIRenderEngine *GetUIRenderEngine() { return m_pRenderEngine; } |
|
virtual bool BIsVisible() { return true; } |
|
virtual bool BIsOverlay() OVERRIDE { return UIEngine()->BIsOverlayTarget(m_eRenderTarget); } |
|
virtual bool BIsSteamWMOverlay() OVERRIDE { return m_eRenderTarget == IUIEngine::k_ERenderToOverlaySteamWM; } |
|
|
|
virtual bool BIsFullscreen() { return IUIEngine::BIsRenderingToFullScreen( m_eRenderTarget ); } |
|
virtual bool BIsFullscreenBorderlessWindow() { return m_eRenderTarget == IUIEngine::k_ERenderBorderlessFullScreenWindow; } |
|
bool SetFullscreen( bool bFullscreen ); |
|
bool BEnforceWindowAspectRatio() { return m_bEnforceWindowAspectRatio; } |
|
virtual uint32 GetSurfaceWidth() OVERRIDE { return m_unSurfaceWidth; } |
|
virtual uint32 GetSurfaceHeight() OVERRIDE { return m_unSurfaceHeight; } |
|
virtual uint32 GetWindowWidth() OVERRIDE { return m_unWindowWidth; } |
|
virtual uint32 GetWindowHeight() OVERRIDE { return m_unWindowHeight; } |
|
void ConvertClientToSurfaceCoord( float *px, float *py ); |
|
void GetFPSAverages( float &fpsPaint, float &fpsAnimation, float &fpsRender ); |
|
virtual void GetSessionFPSAverages( float &fpsPaint, float &fpsAnimation, float &fpsRender ) OVERRIDE; |
|
virtual void GetNumPeriodsBelowMinFPS( int &nSlowPeriods ) OVERRIDE; |
|
|
|
// Clear color for the window, normally black, transparent for overlay |
|
virtual Color GetClearColor() { return Color( 0, 0, 0, 255 ); } |
|
|
|
// Panel management for the window |
|
int AddPanel( CUIPanel *pPanel, bool bVisible ); |
|
void RemovePanel( int iPanelIndex, bool bVisible ); |
|
int SetPanelVisible( int iPanelIndex, bool bVisible ); |
|
virtual void AddClass( const char *pchName ) OVERRIDE; |
|
virtual void RemoveClass( const char *pchName ) OVERRIDE; |
|
|
|
// Layout/paint for window |
|
virtual void LayoutAndPaintIfNeeded(); |
|
|
|
// Paint an empty frame so the animation/render threads will run but do nothing but LRU/clear data |
|
virtual void PaintEmptyFrameAndForceLaterRepaint(); |
|
|
|
// Layout file auto-reload for windows children panels |
|
void ReloadLayoutFile( CPanoramaSymbol symPath ); |
|
void OnReloadStyleFile( CPanoramaSymbol symPath ); |
|
|
|
// Access input engine for window |
|
virtual IUIWindowInput *UIWindowInput() OVERRIDE { return (IUIWindowInput *)m_pInputEngine; } |
|
|
|
// custom mouse cursor support, returns true if we want our manually drawn one, false for OS specific ones |
|
bool BUseCustomMouseCursor() { return m_bUseCustomMouseCursor; } |
|
// used by the os specific case to update the cursor |
|
virtual void SetMouseCursor( EMouseCursors eCursor ) = 0; |
|
IImageSource *GetMouseCursorTexture( Vector2D *pptHotspot ); |
|
|
|
virtual bool BCursorVisible() OVERRIDE; |
|
virtual bool BCursorFadingOut() OVERRIDE; |
|
virtual void WakeupMouseCursor() OVERRIDE; |
|
virtual void FadeOutCursorNow() OVERRIDE; |
|
|
|
// Access image manager for window |
|
CImageResourceManager* AccessImageManager() { return m_pImageResourceManager; } |
|
|
|
// Set a context ptr that is attached to the window, just lets other code (panels) that |
|
// has access to the window access some shared state across the window. |
|
virtual void SetContextPtr( void *pv ) OVERRIDE { m_pContextPtr = pv; } |
|
|
|
// Get the context ptr that is attached to the window |
|
virtual void * GetContextPtr() const OVERRIDE { return m_pContextPtr; } |
|
|
|
void ReloadChangedFile( const char *pchFile ); |
|
|
|
// Access fast scroll sound manager for the window |
|
CFastScrollSoundManager * AccessFastScrollSoundMgr(); |
|
|
|
void GetMouseWheelRepeats( bool bScrollUp, int lines, uint8 &unRepeats ); |
|
|
|
virtual uint32 GetNumVisibleTopLevelPanels() const OVERRIDE { return (uint32)m_listVisiblePanels.Count(); } |
|
|
|
virtual const CUtlLinkedList< IUIPanel* > &GetTopLevelVisiblePanels() const OVERRIDE { return (CUtlLinkedList< IUIPanel* > &)m_listVisiblePanels; } |
|
|
|
// Get the last time the window layed out and painted |
|
float GetLastLayoutAndPaintTime() { return m_flLastLayoutAndPaintTime; } |
|
|
|
// Set max FPS for the window |
|
void SetMaxFPS( float flMaxFPS ); |
|
|
|
// Set a min FPS for the window, this actually just prevents setting the max lower |
|
virtual void SetMinFPS( float flMinFPS ) OVERRIDE { m_flMinFPS = flMinFPS; } |
|
|
|
// access data about how the gamepad was used |
|
virtual bool BWasGamepadConnectedThisSession() OVERRIDE; |
|
virtual bool BWasGamepadUsedThisSession() OVERRIDE; |
|
|
|
virtual bool BWasSteamControllerConnectedThisSession() OVERRIDE; |
|
virtual bool BWasSteamControllerUsedThisSession() OVERRIDE; |
|
|
|
// metrics |
|
virtual void RecordDaisyWheelUsage( float flEntryTimeInSeconds, int nWordsEntered, bool bViaKeyboard, bool bViaGamepad ) OVERRIDE; |
|
virtual void GetDaisyWheelWPM( int &nWordsTyped, float &flMixedWPM, float &flKeyboardOnlyWPM, float &flGamepadOnlyWPM ) OVERRIDE; |
|
|
|
bool BFinishedInitialization() { return m_bFinishedInitialization; } |
|
|
|
virtual bool BIsWindowInLayoutPass() OVERRIDE { return m_bInLayoutTraverse; } |
|
|
|
virtual void SetInhibitInput( bool bInhibitInput ) OVERRIDE; |
|
virtual void SetPreventForceWindowOnTop( bool bPreventForceTopLevel ) OVERRIDE; |
|
|
|
// Access overlay window interface for this window, NULL on non Steam Overlay windows |
|
virtual IUIOverlayWindow *GetOverlayInterface() OVERRIDE { return NULL; } |
|
|
|
virtual void SetFocusBehavior( EWindowFocusBehavior eFocusBehavior ) OVERRIDE { m_eFocusBehavior = eFocusBehavior; } |
|
virtual EWindowFocusBehavior GetFocusBehavior() OVERRIDE{ return m_eFocusBehavior; } |
|
|
|
virtual void OnDeviceLost() OVERRIDE; |
|
virtual void OnDeviceRestored() OVERRIDE; |
|
virtual bool BDeviceLost() OVERRIDE; |
|
|
|
// Clears the GPU resources associated with the window before the next render frame |
|
virtual void ClearGPUResourcesBeforeNextFrame() OVERRIDE; |
|
|
|
#ifdef DBGFLAG_VALIDATE |
|
virtual void Validate( CValidator &validator, const tchar *pchName ); |
|
|
|
bool PrepareForValidate(); |
|
bool ResumeFromValidate(); |
|
#endif |
|
protected: |
|
|
|
// Perform layout prior to paint |
|
void PerformLayout(); |
|
bool BIsGuideButton( const InputMessage_t &msg ); |
|
|
|
// Render engine instance for window |
|
CUIRenderEngine *m_pRenderEngine; |
|
|
|
// Do we need to clear gpu resources before repaint |
|
uint32 m_unFramesToClearGPUResourcesBeforeRepaint; |
|
|
|
// Image manager for the window |
|
CImageResourceManager *m_pImageResourceManager; |
|
|
|
bool m_bDeviceLost; |
|
bool m_bAlreadyForcedRepaintAllSinceLastPaint; |
|
CUtlString m_strTargetMonitor; |
|
uint32 m_unSurfaceWidth, m_unSurfaceHeight; |
|
uint32 m_unWindowWidth, m_unWindowHeight; |
|
IUIEngine::ERenderTarget m_eRenderTarget; |
|
bool m_bFixedSurfaceSize; |
|
bool m_bEnforceWindowAspectRatio; |
|
bool m_bUseCustomMouseCursor; // true if we draw our tenfoot cursors and not the win32 ones for this panel |
|
bool m_bCursorWasVisibleLastFrame; |
|
EMouseCursors m_eCursorCurrent; // current cursor to draw |
|
CMouseCursorTexture *m_pMouseCursor; // contains the image data for the cursors we can display |
|
|
|
// owner of details about the cursor state |
|
CMouseCursorRender *m_pCursorRender; |
|
|
|
// Input engine |
|
CUIWindowInput *m_pInputEngine; |
|
|
|
// the ui engine that owns us |
|
CUIEngine *m_pUIEngineParent; |
|
void *m_pContextPtr; |
|
|
|
// Scale factor for all drawing sizes |
|
float m_flScaleFactor; |
|
|
|
// Min fps value the max fps can be set to for this window |
|
float m_flMinFPS; |
|
|
|
// Track last layout and paint time |
|
double m_flLastLayoutAndPaintTime; |
|
|
|
// Pointer for the surface interface created for the window |
|
IUI3DSurface *m_pSurfaceInterface; |
|
|
|
// Panel lists |
|
CUtlLinkedList< CUIPanel * > m_listVisiblePanels; |
|
CUtlLinkedList< CUIPanel * > m_listInvisiblePanels; |
|
|
|
// Classes to apply to top level panels |
|
CUtlVector< CPanoramaSymbol > m_vecStyleClasses; |
|
|
|
// Panels to asynchronously add classes to |
|
CUtlVector< CPanelPtr< IUIPanel > > m_vecPanelsAddClasses; |
|
|
|
// Panels to asynchronously remove classes from |
|
CUtlVector< CPanelPtr< IUIPanel > > m_vecPanelsRemoveClasses; |
|
|
|
CFastScrollSoundManager *m_pFastScrollSoundManager; |
|
|
|
// Mouse wheel repeat tracking |
|
uint8 m_unMouseWheelUpRepeats; |
|
uint8 m_unMouseWheelDownRepeats; |
|
double m_flLastMouseWheelUp; |
|
double m_flLastMouseWheelDown; |
|
|
|
bool m_bInLayoutTraverse; |
|
bool m_bInPaintTraverse; |
|
bool m_bFinishedInitialization; |
|
|
|
// daisy wheel usage for this window |
|
enum EDaisyWheelInputType |
|
{ |
|
eDaisyWheelInputType_KeyboardOnly, |
|
eDaisyWheelInputType_GamepadOnly, |
|
eDaisyWheelInputType_KeyboardAndGamePad, |
|
|
|
eDaisyWheelInputType_MAX |
|
}; |
|
struct DaisyWheelUsage_t |
|
{ |
|
int nWords; |
|
float flTime; |
|
}; |
|
DaisyWheelUsage_t m_flDaisyWheelWPM[eDaisyWheelInputType_MAX]; |
|
|
|
virtual void Shutdown(); |
|
|
|
bool m_bInhibitInput; |
|
|
|
EWindowFocusBehavior m_eFocusBehavior; |
|
}; |
|
|
|
} // namespace panorama |
|
|
|
#endif // UITOPLEVELWINDOW_H
|
|
|