//=========== Copyright Valve Corporation, All rights reserved. ===============// // // Purpose: //=============================================================================// #ifndef PANORAMA_MOVIEPLAYER_H #define PANORAMA_MOVIEPLAYER_H #ifdef _WIN32 #pragma once #endif #include "panel2d.h" #include "../data/iimagesource.h" #include "../data/panoramavideoplayer.h" #include "panorama/uischeduleddel.h" namespace panorama { class CToggleButton; class CLabel; class CSlider; DECLARE_PANEL_EVENT0( MoviePlayerAudioStart ); DECLARE_PANEL_EVENT0( MoviePlayerAudioStop ); DECLARE_PANEL_EVENT0( MoviePlayerPlaybackStart ); DECLARE_PANEL_EVENT0( MoviePlayerPlaybackStop ); DECLARE_PANEL_EVENT1( MoviePlayerPlaybackEnded, EVideoPlayerPlaybackError ); DECLARE_PANORAMA_EVENT0( MoviePlayerTogglePlayPause ); DECLARE_PANORAMA_EVENT0( MoviePlayerFastForward ); DECLARE_PANEL_EVENT0( MoviePlayerUIVisible ); DECLARE_PANORAMA_EVENT0( MoviePlayerJumpBack ); DECLARE_PANORAMA_EVENT0( MoviePlayerVolumeControl ); DECLARE_PANORAMA_EVENT0( MoviePlayerFullscreenControl ); DECLARE_PANORAMA_EVENT1( MoviePlayerSetRepresentation, int ); DECLARE_PANORAMA_EVENT0( MoviePlayerSelectVideoQuality ); //----------------------------------------------------------------------------- // Purpose: Base class for controls that pop above movie button bar //----------------------------------------------------------------------------- class CMovieControlPopupBase : public CPanel2D { public: CMovieControlPopupBase( CPanel2D *pInvokingPanel, const char *pchPanelID ); virtual ~CMovieControlPopupBase() {} void Show( float flVolume ); void Close(); virtual void OnLayoutTraverse( float flFinalWidth, float flFinalHeight ) OVERRIDE; protected: bool EventCancelled( const CPanelPtr< IUIPanel > &pPanel, EPanelEventSource_t eSource ); CPanel2D *m_pInvisibleBackground; CPanel2D *m_pInvokingPanel; CPanel2D *m_pPopupBackground; }; //----------------------------------------------------------------------------- // Purpose: Top level menu for volume slider //----------------------------------------------------------------------------- class CVolumeSliderPopup : public CMovieControlPopupBase { DECLARE_PANEL2D( CVolumeSliderPopup, CMovieControlPopupBase ); public: CVolumeSliderPopup( CPanel2D *pInvokingPanel, const char *pchPanelID ); virtual ~CVolumeSliderPopup() {} void Show( float flVolume ); virtual bool OnKeyDown( const KeyData_t &unichar ) OVERRIDE; private: bool EventSliderValueChanged( const CPanelPtr< IUIPanel > &pPanel, float flValue ); CSlider *m_pSlider; }; //----------------------------------------------------------------------------- // Purpose: Top level menu for showing video resolutions to select //----------------------------------------------------------------------------- class CMovieVideoQualityPopup : public CMovieControlPopupBase { DECLARE_PANEL2D( CMovieVideoQualityPopup, CMovieControlPopupBase ); public: CMovieVideoQualityPopup( CPanel2D *pInvokingPanel, const char *pchPanelID ); virtual ~CMovieVideoQualityPopup() {} void AddRepresentation( int iRep, int nHeight ); void Show( int iFocusRep, int nVideoHeight ); private: struct Representation_t { int m_iRep; int m_nHeight; }; bool EventSetRepresentation( int iRep ); static bool SortRepresentations( const Representation_t &lhs, const Representation_t &rhs ); CUtlVector< Representation_t > m_vecRepresentations; }; //----------------------------------------------------------------------------- // Purpose: Movie panel. Just displays the movie //----------------------------------------------------------------------------- class CMoviePanel : public CPanel2D { DECLARE_PANEL2D( CMoviePanel, CPanel2D ); public: CMoviePanel( CPanel2D *parent, const char *pchPanelID ); virtual ~CMoviePanel(); CVideoPlayerPtr GetMovie() { return m_pVideoPlayer; } void SetMovie( const char *pchFile ); void SetMovie( CVideoPlayerPtr pVideoPlayer ); bool IsSet() { return (m_pVideoPlayer != NULL); } void Clear(); void SetPlaybackVolume( float flVolume ); void SuggestMovieHeight(); virtual void Paint(); #ifdef DBGFLAG_VALIDATE virtual void ValidateClientPanel( CValidator &validator, const tchar *pchName ) OVERRIDE; #endif protected: virtual void OnContentSizeTraverse( float *pflContentWidth, float *pflContentHeight, float flMaxWidth, float flMaxHeight, bool bFinalDimensions ) OVERRIDE; virtual void OnLayoutTraverse( float flFinalWidth, float flFinalHeight ) OVERRIDE; bool EventVideoPlayerInitialized( IVideoPlayer *pIMovie ); private: CVideoPlayerPtr m_pVideoPlayer; }; //----------------------------------------------------------------------------- // Purpose: Displays debug info for a movie //----------------------------------------------------------------------------- class CMovieDebug : public CPanel2D { DECLARE_PANEL2D( CMovieDebug, CPanel2D ); public: CMovieDebug( CPanel2D *pParent, const char *pchID ); virtual ~CMovieDebug() {} void Show( CVideoPlayerPtr pVideoPlayer ); private: void Update(); CVideoPlayerPtr m_pVideoPlayer; CLabel *m_pDimensions; CLabel *m_pResolution; CLabel *m_pFileType; CLabel *m_pVideoSegment; CLabel *m_pVideoBandwidth; panorama::CUIScheduledDel m_scheduledUpdate; }; //----------------------------------------------------------------------------- // Purpose: Movie player. Includes UI //----------------------------------------------------------------------------- class CMoviePlayer : public CPanel2D { DECLARE_PANEL2D( CMoviePlayer, CPanel2D ); public: CMoviePlayer( CPanel2D *parent, const char *pchPanelID ); virtual ~CMoviePlayer(); virtual void SetupJavascriptObjectTemplate() OVERRIDE; CVideoPlayerPtr GetMovie() { return m_pMoviePanel->GetMovie(); } void SetMovie( const char *pchFile ); void SetMovie( CVideoPlayerPtr pVideoPlayer ); bool IsSet() { return m_pMoviePanel->IsSet(); } void Clear(); enum EAutoplay { k_EAutoplayOff, k_EAutoplayOnLoad, k_EAutoplayOnFocus }; enum EControls { k_EControlsNone, k_EControlsMinimal, k_EControlsFull, k_EControlsInvalid }; void SetAutoplay( EAutoplay eAutoPlay, bool bSkipPlay = false ); void SetRepeat( bool bRepeat ); void SetControls( EControls eControls ); void SetControls( const char *pchControls ); virtual bool OnGamePadDown( const GamePadData_t &code ) OVERRIDE; virtual bool OnKeyTyped( const KeyData_t &unichar ) OVERRIDE; virtual panorama::IUIPanel *OnGetDefaultInputFocus() OVERRIDE; void Play(); void Pause(); void Stop(); void TogglePlayPause(); void FastForward(); void Rewind(); void SetPlaybackVolume( float flVolume ); // title control void SetTitleText( const char *pchText ); void ShowTitle( bool bImmediatelyVisible = false ); void HideTitle(); bool BAdjustingVolume(); virtual bool OnMouseButtonDown( const MouseData_t &code ); protected: virtual bool BSetProperties( const CUtlVector< ParsedPanelProperty_t > &vecProperties ); static EControls EControlsFromString( const char *pchControls ); bool EventInputFocusSet( const CPanelPtr< IUIPanel > &ptrPanel ); bool EventInputFocusLost( const CPanelPtr< IUIPanel > &ptrPanel ); bool EventMovieInitialized( IVideoPlayer *pIMovie ); bool EventVideoPlayerPlaybackStateChanged( IVideoPlayer *pIMovie ); bool EventVideoPlayerChangedRepresentation( IVideoPlayer *pIMovie ); bool EventVideoPlayerEnded( IVideoPlayer *pIMovie ); bool EventActivated( const CPanelPtr< IUIPanel > &ptrPanel, EPanelEventSource_t eSource ); bool EventCancelled( const CPanelPtr< IUIPanel > &ptrPanel, EPanelEventSource_t eSource ); bool EventMovieTogglePlayPause(); bool EventMoviePlayerFastForward(); bool EventMoviePlayerJumpBack(); bool EventMoviePlayerVolumeControl(); bool EventMoviePlayerSelectQuality(); bool EventSoundVolumeChanged( ESoundType eSoundType, float flVolume ); bool EventSoundMuteChanged( bool bMute ); bool EventSetRepresentation( int iRep ); void UpdateFullUI(); void UpdateTimeline(); void UpdatePlayPauseButton(); void UpdatePlaybackSpeed(); void Seek( uint unOffset ); void RaisePlaybackStartEvents(); void RaisePlaybackStopEvents(); void DisplayControls( bool bVisible ); void DisplayTimeline( bool bVisible ); bool BAnyControlsVisible(); bool BControlBarVisible(); bool BTimelineVisible(); void UpdateMovingPlayingStyle(); void UpdateVolumeControls(); void SetAudioVolumeStyle( CPanoramaSymbol symStyle ); void ShowTitleInternal( bool bImmediatelyVisible = false ); void HideTitleInternal(); private: CMoviePanel *m_pMoviePanel; CPanelPtr< CMovieDebug > m_ptrDebug; // minimal UI CPanel2D *m_pLoadingThrobber; CPanel2D *m_pPlayIndicator; CPanoramaSymbol m_symMoviePlaybackStyle; // title sections CPanel2D *m_pPlaybackTitleAndControls; CLabel *m_pPlaybackTitle; bool m_bExternalShowTitle; // full UI CPanel2D *m_pPlaybackControls; CPanel2D *m_pPlaybackProgressBar; CToggleButton *m_pPlayPauseBtn; CLabel *m_pPlaybackSpeed; CPanel2D *m_pTimeline; CPanel2D *m_pControlBarRow; CPanel2D *m_pVolumeControl; CLabel *m_pErrorMessage; CPanelPtr< CVolumeSliderPopup > m_ptrVolumeSlider; CPanelPtr< CMovieVideoQualityPopup > m_ptrVideoQualityPopup; CButton *m_pVideoQualityBtn; bool m_bInConstructor; bool m_bRaisedAudioStartEvent; bool m_bRaisedPlaybackStartEvent; bool m_bHadFocus; bool m_bCloseControlsOnPlay; EAutoplay m_eAutoplay; EControls m_eControls; bool m_bDisableActivatePause; bool m_bShowControlsNotFullscreen; bool m_bRepeat; bool m_bMuted; // muted flag float m_flVolume; // playback volume, defaults to movie volume setting int m_iDesiredVideoRepresentation; // representation selected by user or -1. Video player might not yet have changed to playing this rep }; } // namespace panorama #endif // PANORAMA_MOVIEPLAYER_H