From 5b4436f93b2a01ef6b1350cbb49060cb921275f3 Mon Sep 17 00:00:00 2001 From: Nick Randolph Date: Thu, 11 May 2023 18:07:54 +1000 Subject: [PATCH] feat: Resizing video for transport controls --- .../GTKMediaPlayer.cs | 53 +++++++++++-------- .../MediaPlayerExtension.cs | 7 ++- .../MediaTransportControls.cs | 34 +++++++++++- .../Media/Playback/IMediaPlayerExtension.cs | 5 ++ src/Uno.UWP/Media/Playback/MediaPlayer.cs | 8 +++ .../Media/Playback/MediaPlayer.others.cs | 4 ++ 6 files changed, 87 insertions(+), 24 deletions(-) diff --git a/src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/GTKMediaPlayer.cs b/src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/GTKMediaPlayer.cs index 46e1ff0e6a..f21ddca722 100644 --- a/src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/GTKMediaPlayer.cs +++ b/src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/GTKMediaPlayer.cs @@ -32,7 +32,7 @@ public partial class GTKMediaPlayer : Border private VideoView? _videoView; private double _ratio; Windows.UI.Xaml.Media.Stretch _stretch = Windows.UI.Xaml.Media.Stretch.Uniform; - private int _transportControlAdjust = 94; + private Rect _transportControlsBounds; //public int VideoHeight; //public int VideoWidth; public double Duration { get; set; } @@ -173,8 +173,8 @@ public partial class GTKMediaPlayer : Border } - UpdateTransportControlHeight(); - var playerHeight = (double)this.ActualHeight - _transportControlAdjust; + //UpdateTransportControlHeight(); + var playerHeight = (double)this.ActualHeight - _transportControlsBounds.Height; var playerWidth = (double)this.ActualWidth; var playerRatio = playerHeight / playerWidth; @@ -263,25 +263,25 @@ public partial class GTKMediaPlayer : Border } }); } - protected void UpdateTransportControlHeight() - { - UIElement? container = VisualTreeHelper.GetParent(_videoContainer) as UIElement; - ContentPresenter? ContentPresenter = VisualTreeHelper.GetParent(container) as ContentPresenter; - ContentControl? ContentControl = VisualTreeHelper.GetParent(ContentPresenter) as ContentControl; - MediaPlayerPresenter? MediaPlayerPresenter = VisualTreeHelper.GetParent(ContentControl) as MediaPlayerPresenter; - UIElement? MediaPlayerPresenter2 = VisualTreeHelper.GetParent(MediaPlayerPresenter) as UIElement; - - if (MediaPlayerPresenter2 != null) - { - foreach (var child in MediaPlayerPresenter2.GetChildren()) - { - if (child is ContentPresenter) - { - _transportControlAdjust = (int)child.DesiredSize.Height; - } - } - } - } + //protected void UpdateTransportControlHeight() + //{ + // UIElement? container = VisualTreeHelper.GetParent(_videoContainer) as UIElement; + // ContentPresenter? ContentPresenter = VisualTreeHelper.GetParent(container) as ContentPresenter; + // ContentControl? ContentControl = VisualTreeHelper.GetParent(ContentPresenter) as ContentControl; + // MediaPlayerPresenter? MediaPlayerPresenter = VisualTreeHelper.GetParent(ContentControl) as MediaPlayerPresenter; + // UIElement? MediaPlayerPresenter2 = VisualTreeHelper.GetParent(MediaPlayerPresenter) as UIElement; + + // if (MediaPlayerPresenter2 != null) + // { + // foreach (var child in MediaPlayerPresenter2.GetChildren()) + // { + // if (child is ContentPresenter) + // { + // _transportControlAdjust = (int)child.DesiredSize.Height; + // } + // } + // } + //} protected override Size ArrangeOverride(Size finalSize) { @@ -345,4 +345,13 @@ public partial class GTKMediaPlayer : Border } } + internal void SetTransportControlsBounds(Rect bounds) + { + if (!_transportControlsBounds.Equals(bounds)) + { + _transportControlsBounds = bounds; + UpdateVideoStretch(); + } + } + } diff --git a/src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/MediaPlayerExtension.cs b/src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/MediaPlayerExtension.cs index 2c031e492b..796f297380 100644 --- a/src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/MediaPlayerExtension.cs +++ b/src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/MediaPlayerExtension.cs @@ -23,6 +23,7 @@ using Windows.UI.Xaml.Controls.Maps; using System.Numerics; using Uno.Logging; using Windows.UI.Xaml; +using Atk; [assembly: ApiExtension(typeof(IMediaPlayerExtension), typeof(Uno.UI.Media.MediaPlayerExtension))] @@ -38,7 +39,6 @@ public partial class MediaPlayerExtension : IMediaPlayerExtension private GTKMediaPlayer? _player; - private bool _updatingPosition; private bool _isPlayRequested; private bool _isPlayerPrepared; @@ -372,6 +372,11 @@ public partial class MediaPlayerExtension : IMediaPlayerExtension public double AudioBalance { get; set; } + public void SetTransportControlsBounds(Rect bounds) + { + _player?.SetTransportControlsBounds(bounds); + } + public void SetUriSource(Uri uri) { //if (this.Log().IsEnabled(LogLevel.Debug)) diff --git a/src/Uno.UI/UI/Xaml/Controls/MediaPlayerElement/MediaTransportControls.cs b/src/Uno.UI/UI/Xaml/Controls/MediaPlayerElement/MediaTransportControls.cs index 35010c9852..a647cdb7de 100644 --- a/src/Uno.UI/UI/Xaml/Controls/MediaPlayerElement/MediaTransportControls.cs +++ b/src/Uno.UI/UI/Xaml/Controls/MediaPlayerElement/MediaTransportControls.cs @@ -7,6 +7,7 @@ using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Uno.UI.Xaml.Controls.MediaPlayer.Internal; +using System.Drawing; #if __IOS__ using UIKit; @@ -241,6 +242,10 @@ namespace Windows.UI.Xaml.Controls _compactOverlayButton.Tapped -= UpdateMediaTransportControlMode; _compactOverlayButton.Tapped += UpdateMediaTransportControlMode; + _controlPanelGrid = this.GetTemplateChild(ControlPanelGridName) as Grid; + _controlPanelGrid.SizeChanged -= ControlPanelGridSizeChanged; + _controlPanelGrid.SizeChanged += ControlPanelGridSizeChanged; + _repeatVideoButton = this.GetTemplateChild(RepeatVideoButtonName) as Button; _repeatVideoButton?.SetBinding(Button.VisibilityProperty, new Binding { Path = "IsRepeatButtonVisible", Source = this, Mode = BindingMode.OneWay, FallbackValue = Visibility.Collapsed, Converter = trueToVisible }); _repeatVideoButton?.SetBinding(Button.IsEnabledProperty, new Binding { Path = "IsRepeatEnabled", Source = this, Mode = BindingMode.OneWay, FallbackValue = true }); @@ -305,6 +310,11 @@ namespace Windows.UI.Xaml.Controls } } + private void ControlPanelGridSizeChanged(object sender, SizeChangedEventArgs args) + { + OnControlsBoundsChanged(); + } + private void FullWindowButtonTapped(object sender, RoutedEventArgs e) { _mpe.IsFullWindow = !_mpe.IsFullWindow; @@ -361,6 +371,7 @@ namespace Windows.UI.Xaml.Controls { VisualStateManager.GoToState(this, "ControlPanelFadeIn", false); }); + OnControlsBoundsChanged(); } public void Hide() @@ -374,6 +385,23 @@ namespace Windows.UI.Xaml.Controls VisualStateManager.GoToState(this, "ControlPanelFadeOut", false); } }); + OnControlsBoundsChanged(); + } + + private void OnControlsBoundsChanged() + { + var root = (XamlRoot.Content as UIElement); + if (root is null) + { + return; + } + var transportBounds = + this.TransformToVisual(root) + .TransformBounds( + new Foundation.Rect( + 0, 0, + _controlPanelGrid.ActualWidth, _isInteractive ? _controlPanelGrid.ActualHeight : 0)); + this._mediaPlayer?.SetTransportControlBounds(transportBounds); } private void OnPaneGridTapped(object sender, TappedRoutedEventArgs e) @@ -409,11 +437,15 @@ namespace Windows.UI.Xaml.Controls private void UpdateMediaTransportControlMode() { VisualStateManager.GoToState(this, IsCompact ? "CompactMode" : "NormalMode", true); + OnControlsBoundsChanged(); } private static void OnIsCompactChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) { - VisualStateManager.GoToState((MediaTransportControls)dependencyObject, (bool)args.NewValue ? "CompactMode" : "NormalMode", false); + if (dependencyObject is MediaTransportControls mtc) + { + mtc.UpdateMediaTransportControlMode(); + } } private static void OnShowAndHideAutomaticallyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) diff --git a/src/Uno.UWP/Media/Playback/IMediaPlayerExtension.cs b/src/Uno.UWP/Media/Playback/IMediaPlayerExtension.cs index 1658285a82..135362539c 100644 --- a/src/Uno.UWP/Media/Playback/IMediaPlayerExtension.cs +++ b/src/Uno.UWP/Media/Playback/IMediaPlayerExtension.cs @@ -89,6 +89,11 @@ namespace Uno.Media.Playback /// TimeSpan Position { get; set; } + /// + /// Sets the transport controls bounds so that video can be displayed around controls + /// + void SetTransportControlsBounds(Rect bounds); + /// /// Sets the source from a Uri /// diff --git a/src/Uno.UWP/Media/Playback/MediaPlayer.cs b/src/Uno.UWP/Media/Playback/MediaPlayer.cs index 700628fc16..8cae6a9808 100644 --- a/src/Uno.UWP/Media/Playback/MediaPlayer.cs +++ b/src/Uno.UWP/Media/Playback/MediaPlayer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Drawing; using System.Security.AccessControl; using Windows.Foundation; @@ -93,5 +94,12 @@ namespace Windows.Media.Playback } partial void OnOptionChanged(string name, object value); + + internal void SetTransportControlBounds(Rect bounds) + { + OnTransportControlBoundsChanged(bounds); + } + + partial void OnTransportControlBoundsChanged(Rect bounds); } } diff --git a/src/Uno.UWP/Media/Playback/MediaPlayer.others.cs b/src/Uno.UWP/Media/Playback/MediaPlayer.others.cs index 902327d84a..833ad4cd50 100644 --- a/src/Uno.UWP/Media/Playback/MediaPlayer.others.cs +++ b/src/Uno.UWP/Media/Playback/MediaPlayer.others.cs @@ -9,6 +9,7 @@ using Uno.Foundation.Logging; using Windows.Foundation; using Uno.Media.Playback; using Windows.ApplicationModel.Email; +using System.Drawing; namespace Windows.Media.Playback { @@ -39,6 +40,9 @@ namespace Windows.Media.Playback partial void OnOptionChanged(string name, object value) => _extension?.OnOptionChanged(name, value); + partial void OnTransportControlBoundsChanged(Rect bounds) + => _extension?.SetTransportControlsBounds(bounds); + public void Dispose() => _extension?.Dispose(); -- GitLab