first commit
This commit is contained in:
@@ -0,0 +1,195 @@
|
||||
using RenderHeads.Media.AVProVideo;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class OptionsSubtitlesPage : MonoBehaviour
|
||||
{
|
||||
[Header("Media Player")]
|
||||
[SerializeField] private MediaPlayer _MediaPlayer;
|
||||
|
||||
[Header("Options Menu")]
|
||||
[SerializeField] private OptionsMenu _OptionsMenu;
|
||||
|
||||
[Header("Content")]
|
||||
[SerializeField] private Transform _Content;
|
||||
[SerializeField] private RectTransform _ScrollViewRectTransform;
|
||||
[SerializeField] private RectTransform _ViewportRectTransform;
|
||||
[SerializeField] private GameObject _SubtitleLinePrefab;
|
||||
|
||||
|
||||
private string m_SetupForVideoPath;
|
||||
|
||||
|
||||
private class CSubtitleSet
|
||||
{
|
||||
public GameObject m_LineGO = null;
|
||||
}
|
||||
private List<CSubtitleSet> m_lSubtitleSets = new List<CSubtitleSet>();
|
||||
|
||||
|
||||
void Start()
|
||||
{
|
||||
// Add 'Off'
|
||||
AddSubtitleSet( "Off", true );
|
||||
|
||||
UpdateSets();
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
UpdateSets();
|
||||
}
|
||||
|
||||
private void AddSubtitleSet( string title, bool bEnabled )
|
||||
{
|
||||
GameObject newLineGO = GameObject.Instantiate( _SubtitleLinePrefab, _Content );
|
||||
if( newLineGO != null )
|
||||
{
|
||||
// Setup text
|
||||
Transform titleTransform = newLineGO.transform.Find( "TitleText" );
|
||||
Text titleText = ( titleTransform != null ) ? titleTransform.GetComponent<Text>() : null;
|
||||
if( titleText != null )
|
||||
{
|
||||
titleText.text = title;
|
||||
}
|
||||
|
||||
// Tick icon
|
||||
if( bEnabled )
|
||||
{
|
||||
Transform tickIconTransform = newLineGO.transform.Find( "TickIcon" );
|
||||
Image tickIconImage = ( tickIconTransform != null ) ? tickIconTransform.GetComponent<Image>() : null;
|
||||
if( tickIconImage != null )
|
||||
{
|
||||
tickIconImage.enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
// On click
|
||||
if( _OptionsMenu )
|
||||
{
|
||||
TextTracks textTracks = ( _MediaPlayer ) ? _MediaPlayer.TextTracks.GetTextTracks() : null;
|
||||
|
||||
Button button = newLineGO.GetComponent<Button>();
|
||||
if( button && textTracks != null )
|
||||
{
|
||||
int iIndex = m_lSubtitleSets.Count;
|
||||
button.onClick.AddListener( delegate
|
||||
{
|
||||
_OptionsMenu.ChangeSubtitleTrack( ( ( iIndex > 0 ) ? textTracks[ iIndex - 1 ].Uid : -1 ) );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
// Add it to the list
|
||||
CSubtitleSet cSubtitleSet = new CSubtitleSet();
|
||||
cSubtitleSet.m_LineGO = newLineGO;
|
||||
m_lSubtitleSets.Add( cSubtitleSet );
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateSets()
|
||||
{
|
||||
if( _MediaPlayer != null && _MediaPlayer.Control.HasMetaData() )
|
||||
{
|
||||
if( m_SetupForVideoPath == null || !m_SetupForVideoPath.Equals( _MediaPlayer.MediaPath.Path ) )
|
||||
{
|
||||
m_SetupForVideoPath = _MediaPlayer.MediaPath.Path;
|
||||
|
||||
bool bIgnoreFirst = true;
|
||||
foreach( CSubtitleSet subtitleSet in m_lSubtitleSets )
|
||||
{
|
||||
if( !bIgnoreFirst )
|
||||
{
|
||||
GameObject.Destroy( subtitleSet.m_LineGO );
|
||||
subtitleSet.m_LineGO = null;
|
||||
}
|
||||
|
||||
bIgnoreFirst = false;
|
||||
}
|
||||
|
||||
// Remove everything but the first one
|
||||
if( m_lSubtitleSets.Count > 1 )
|
||||
{
|
||||
m_lSubtitleSets.RemoveRange( 1, (m_lSubtitleSets.Count - 1) );
|
||||
}
|
||||
|
||||
// Add all subtitle sets
|
||||
foreach( TextTrack textTrack in _MediaPlayer.TextTracks.GetTextTracks() )
|
||||
{
|
||||
AddSubtitleSet( textTrack.DisplayName, false );
|
||||
}
|
||||
|
||||
if( m_lSubtitleSets.Count > 1 )
|
||||
{
|
||||
// Reposition everything
|
||||
float fLineHeight = 40.0f;
|
||||
float fTotalHeight = fLineHeight * m_lSubtitleSets.Count;
|
||||
|
||||
RectTransform contentRectTransform = ( _Content != null ) ? _Content.GetComponent<RectTransform>() : null;
|
||||
if( contentRectTransform != null )
|
||||
{
|
||||
contentRectTransform.sizeDelta = new Vector2( contentRectTransform.sizeDelta.x, fTotalHeight );
|
||||
}
|
||||
|
||||
float fY = (fTotalHeight * 0.5f) - (fLineHeight * 0.5f);
|
||||
foreach ( CSubtitleSet subtitleSet in m_lSubtitleSets )
|
||||
{
|
||||
RectTransform rectTransform = subtitleSet.m_LineGO.GetComponent<RectTransform>();
|
||||
if ( rectTransform )
|
||||
{
|
||||
rectTransform.anchoredPosition = new Vector2( 0.0f, fY );
|
||||
fY -= fLineHeight;
|
||||
}
|
||||
}
|
||||
|
||||
if( _ViewportRectTransform && _ScrollViewRectTransform )
|
||||
{
|
||||
float fMaxHeight = 222.0f;
|
||||
|
||||
float fNewHeight = Mathf.Clamp( fTotalHeight, fLineHeight, fMaxHeight );
|
||||
float fBottomPadding = 12.0f;
|
||||
|
||||
RectTransform rectTransform = transform.GetComponent<RectTransform>();
|
||||
rectTransform.sizeDelta = new Vector2( rectTransform.sizeDelta.x, 60.0f + fNewHeight + fBottomPadding );
|
||||
|
||||
_ScrollViewRectTransform.sizeDelta = new Vector2(_ScrollViewRectTransform.sizeDelta.x, fNewHeight );
|
||||
_ViewportRectTransform.sizeDelta = new Vector2( _ViewportRectTransform.sizeDelta.x, fNewHeight );
|
||||
}
|
||||
}
|
||||
|
||||
ChangeSubtitleTrack( _MediaPlayer.TextTracks.GetTextTracks().GetActiveTrackIndex(), false ); // Add one to move past the 'Off' which is at index zero
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ChangeSubtitleTrack( int iTrackUid, bool bSetTrack = true )
|
||||
{
|
||||
TextTracks textTracks = ( _MediaPlayer ) ? _MediaPlayer.TextTracks.GetTextTracks() : null;
|
||||
if( textTracks != null )
|
||||
{
|
||||
int iTrackIndex = _MediaPlayer.TextTracks.GetTextTrackArrayIndexFromUid( iTrackUid );
|
||||
|
||||
if( bSetTrack )
|
||||
{
|
||||
// Change text track on the media player
|
||||
_MediaPlayer.TextTracks.SetActiveTextTrack( ( iTrackIndex > -1 ) ? textTracks[ iTrackIndex ]: null );
|
||||
}
|
||||
|
||||
// Sort out UI
|
||||
int iIndex = 0;
|
||||
foreach( CSubtitleSet subtitleSet in m_lSubtitleSets )
|
||||
{
|
||||
Transform tickIconTransform = subtitleSet.m_LineGO.transform.Find( "TickIcon" );
|
||||
Image tickIconImage = ( tickIconTransform != null ) ? tickIconTransform.GetComponent<Image>() : null;
|
||||
if ( tickIconImage != null )
|
||||
{
|
||||
tickIconImage.enabled = ( iIndex == (iTrackIndex + 1) );
|
||||
}
|
||||
|
||||
++iIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user