using System;
namespace Editor.Widgets;
public class VideoGallery : Widget
{
public VideoGallery( Widget parent ) : base( parent )
{
Layout = Layout.Grid();
Layout.Spacing = 0;
if ( Layout is GridLayout gridLayout )
{
gridLayout.AddCell( 0, 0, new VideoWidget( this, "https://files.facepunch.com/layla/1b0511b1/homelander_TRH_sfm_test_v008_720p.mp4" ), 1 );
}
}
[WidgetGallery]
[Title( "VideoPlayer" )]
[Icon( "movie" )]
internal static Widget WidgetGallery()
{
var canvas = new VideoGallery( null );
return canvas;
}
}
///
/// A widget that uses a pixmap to display a video.
///
public class VideoWidget : Widget
{
///
/// Access to the video player to control playback.
///
public VideoPlayer Player { get; private set; }
private Pixmap background;
public VideoWidget( Widget parent, string url ) : base( parent )
{
MinimumSize = 50;
Player = new VideoPlayer
{
Repeat = true,
OnTextureData = OnTextureData
};
if ( !string.IsNullOrWhiteSpace( url ) )
{
Player.Play( url );
}
}
private void OnTextureData( ReadOnlySpan span, Vector2 size )
{
if ( background == null || background.Size != size )
{
background = new Pixmap( size );
}
background.UpdateFromPixels( span, size, ImageFormat.RGBA8888 );
Update();
}
protected override void OnPaint()
{
Paint.ClearPen();
Paint.SetBrush( Color.Black );
Paint.DrawRect( LocalRect );
if ( background == null )
return;
var textureSize = background.Size;
var viewportSize = Size;
var scaleW = viewportSize.x / textureSize.x;
var scaleH = viewportSize.y / textureSize.y;
var scale = Math.Min( scaleW, scaleH );
var newSize = new Vector2( textureSize.x * scale, textureSize.y * scale );
var rect = new Rect( (viewportSize.x - newSize.x) / 2, (viewportSize.y - newSize.y) / 2, newSize.x, newSize.y );
Paint.Draw( rect, background );
}
public override void OnDestroyed()
{
base.OnDestroyed();
Player?.Dispose();
Player = null;
}
[EditorEvent.Frame]
public void Frame()
{
Player?.Present();
}
protected override void OnMouseClick( MouseEvent e )
{
base.OnMouseClick( e );
if ( e.LeftMouseButton )
{
Player?.TogglePause();
}
}
}