|
|
//=========== 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
|