source-engine/public/panorama/controls/movieplayer.h
FluorescentCIAAfricanAmerican 3bf9df6b27 1
2020-04-22 12:56:21 -04:00

321 lines
9.6 KiB
C++

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