Skip to content

Commit

Permalink
Merge pull request #229 from huynhsontung/fix-resize
Browse files Browse the repository at this point in the history
feat: rework auto resize behavior
  • Loading branch information
huynhsontung authored Dec 4, 2023
2 parents bdd5aa0 + a812bb6 commit a723ee3
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 70 deletions.
1 change: 1 addition & 0 deletions Screenbox.Core/Services/IWindowService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public interface IWindowService
public void ExitFullScreen();
public Task<bool> TryExitCompactLayoutAsync();
public Task<bool> TryEnterCompactLayoutAsync(Size viewSize);
Size GetMaxWindowSize();
double ResizeWindow(Size videoDimension, double scalar = 0);
void HideCursor();
void ShowCursor();
Expand Down
28 changes: 22 additions & 6 deletions Screenbox.Core/Services/WindowService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public sealed class WindowService : IWindowService
public WindowViewMode ViewMode
{
get => _viewMode;
set
private set
{
WindowViewMode oldValue = _viewMode;
if (oldValue != value)
Expand Down Expand Up @@ -98,22 +98,38 @@ public async Task<bool> TryEnterCompactLayoutAsync(Size viewSize)
return false;
}

public double ResizeWindow(Size videoDimension, double scalar = 0)
public Size GetMaxWindowSize()
{
DisplayInformation displayInformation = DisplayInformation.GetForCurrentView();
ApplicationView view = ApplicationView.GetForCurrentView();
return GetMaxWindowSize(view, displayInformation);
}

private static Size GetMaxWindowSize(ApplicationView view, DisplayInformation displayInformation)
{
if (scalar < 0 || videoDimension.IsEmpty) return -1;
DisplayInformation? displayInformation = DisplayInformation.GetForCurrentView();
ApplicationView? view = ApplicationView.GetForCurrentView();
double maxWidth = displayInformation.ScreenWidthInRawPixels / displayInformation.RawPixelsPerViewPixel;
double maxHeight = displayInformation.ScreenHeightInRawPixels / displayInformation.RawPixelsPerViewPixel - 48;
if (Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8))
{
DisplayRegion? displayRegion = view.GetDisplayRegions()[0];
DisplayRegion? displayRegion = view.GetDisplayRegions()[0]; // Active display region
maxWidth = displayRegion.WorkAreaSize.Width / displayInformation.RawPixelsPerViewPixel;
maxHeight = displayRegion.WorkAreaSize.Height / displayInformation.RawPixelsPerViewPixel;
}

// Cannot use the full work area size. Subtract some padding.
maxHeight -= 16;
maxWidth -= 16;
return new Size(maxWidth, maxHeight);
}

public double ResizeWindow(Size videoDimension, double scalar = 0)
{
if (scalar < 0 || videoDimension.IsEmpty) return -1;
ApplicationView view = ApplicationView.GetForCurrentView();
DisplayInformation displayInformation = DisplayInformation.GetForCurrentView();
Size maxWindowSize = GetMaxWindowSize(view, displayInformation);
double maxWidth = maxWindowSize.Width;
double maxHeight = maxWindowSize.Height;

if (scalar == 0)
{
Expand Down
55 changes: 0 additions & 55 deletions Screenbox.Core/ViewModels/PlayerElementViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ public sealed partial class PlayerElementViewModel : ObservableRecipient,
public MediaPlayer? VlcPlayer { get; private set; }

private readonly LibVlcService _libVlcService;
private readonly IWindowService _windowService;
private readonly ISystemMediaTransportControlsService _transportControlsService;
private readonly ISettingsService _settingsService;
private readonly IResourceService _resourceService;
Expand All @@ -41,7 +40,6 @@ public sealed partial class PlayerElementViewModel : ObservableRecipient,
private readonly DisplayRequestTracker _requestTracker;
private Size _viewSize;
private Size _aspectRatio;
private bool _forceResize;
private VlcMediaPlayer? _mediaPlayer;
private ManipulationLock _manipulationLock;
private TimeSpan _timeBeforeManipulation;
Expand All @@ -50,13 +48,11 @@ public sealed partial class PlayerElementViewModel : ObservableRecipient,

public PlayerElementViewModel(
LibVlcService libVlcService,
IWindowService windowService,
ISettingsService settingsService,
ISystemMediaTransportControlsService transportControlsService,
IResourceService resourceService)
{
_libVlcService = libVlcService;
_windowService = windowService;
_settingsService = settingsService;
_transportControlsService = transportControlsService;
_resourceService = resourceService;
Expand Down Expand Up @@ -111,37 +107,13 @@ public void Initialize(string[] swapChainOptions)
_mediaPlayer = _libVlcService.MediaPlayer;
Guard.IsNotNull(_mediaPlayer, nameof(_mediaPlayer));
VlcPlayer = _mediaPlayer.VlcPlayer;
_mediaPlayer.NaturalVideoSizeChanged += OnVideoSizeChanged;
_mediaPlayer.PlaybackStateChanged += OnPlaybackStateChanged;
_mediaPlayer.PositionChanged += OnPositionChanged;
_mediaPlayer.MediaFailed += OnMediaFailed;
Messenger.Send(new MediaPlayerChangedMessage(_mediaPlayer));
if (_settingsService.PlayerAutoResize == PlayerAutoResizeOption.OnLaunch)
_forceResize = true;
});
}

public void OnResizeAcceleratorInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
if (sender.Modifiers != VirtualKeyModifiers.None) return;
args.Handled = true;
switch (sender.Key)
{
case VirtualKey.Number1:
ResizeWindow(0.5);
break;
case VirtualKey.Number2:
ResizeWindow(1);
break;
case VirtualKey.Number3:
ResizeWindow(2);
break;
case VirtualKey.Number4:
ResizeWindow(0);
break;
}
}

public void OnClick()
{
if (!_settingsService.PlayerTapGesture || _mediaPlayer?.PlaybackItem == null) return;
Expand Down Expand Up @@ -268,33 +240,6 @@ private void OnPlaybackStateChanged(IMediaPlayer sender, object? args)
_transportControlsService.UpdatePlaybackStatus(sender.PlaybackState);
}

private void OnVideoSizeChanged(IMediaPlayer sender, object? args)
{
if (!_forceResize && _settingsService.PlayerAutoResize != PlayerAutoResizeOption.Always) return;
_forceResize = false;

_dispatcherQueue.TryEnqueue(() =>
{
if (ResizeWindow(1)) return;
ResizeWindow();
});
}

private bool ResizeWindow(double scalar = 0)
{
if (_mediaPlayer == null || scalar < 0 || _windowService.ViewMode != WindowViewMode.Default) return false;
Size videoDimension = new(_mediaPlayer.NaturalVideoWidth, _mediaPlayer.NaturalVideoHeight);
double actualScalar = _windowService.ResizeWindow(videoDimension, scalar);
if (actualScalar > 0)
{
string status = _resourceService.GetString(ResourceName.ScaleStatus, $"{actualScalar * 100:0.##}%");
Messenger.Send(new UpdateStatusMessage(status));
return true;
}

return false;
}

private void SetCropGeometry(Size size)
{
if (_mediaPlayer == null || size.Width < 0 || size.Height < 0) return;
Expand Down
71 changes: 70 additions & 1 deletion Screenbox.Core/ViewModels/PlayerPageViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.ApplicationModel.DataTransfer;
using Windows.Foundation;
using Windows.Media;
using Windows.Media.Playback;
using Windows.Storage;
Expand Down Expand Up @@ -74,6 +75,7 @@ public sealed partial class PlayerPageViewModel : ObservableRecipient,
private readonly LastPositionTracker _lastPositionTracker;
private IMediaPlayer? _mediaPlayer;
private bool _visibilityOverride;
private bool _resizeNext;
private DateTimeOffset _lastUpdated;

public PlayerPageViewModel(IWindowService windowService, IResourceService resourceService, ISettingsService settingsService)
Expand Down Expand Up @@ -134,6 +136,7 @@ public async void Receive(MediaPlayerChangedMessage message)
_mediaPlayer = message.Value;
_mediaPlayer.PlaybackStateChanged += OnStateChanged;
_mediaPlayer.PositionChanged += OnPositionChanged;
_mediaPlayer.NaturalVideoSizeChanged += OnNaturalVideoSizeChanged;

await _lastPositionTracker.LoadFromDiskAsync();
}
Expand Down Expand Up @@ -390,6 +393,33 @@ public void OnManualHideControlsKeyboardAcceleratorInvoked(KeyboardAccelerator s
}
}

public void OnResizeKeyboardAcceleratorInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
if (sender.Modifiers != VirtualKeyModifiers.None) return;
args.Handled = true;
switch (sender.Key)
{
case VirtualKey.Number1:
ResizeWindow(0.5);
break;
case VirtualKey.Number2:
ResizeWindow(1);
break;
case VirtualKey.Number3:
ResizeWindow(2);
break;
case VirtualKey.Number4:
ResizeWindow(0);
break;
}
}

public void OnFileLaunched()
{
if (_settingsService.PlayerAutoResize == PlayerAutoResizeOption.OnLaunch)
_resizeNext = true;
}

// Hidden button acts as a focus sink when controls are hidden
public void HiddenButtonOnClick()
{
Expand Down Expand Up @@ -540,9 +570,16 @@ private async void ProcessOpeningMedia(MediaViewModel? current)
await current.LoadDetailsAsync();
await current.LoadThumbnailAsync();
MediaType = current.MediaType;
bool shouldBeVisible = _settingsService.PlayerAutoResize == PlayerAutoResizeOption.Always && !AudioOnly;
if (PlayerVisibility != PlayerVisibilityState.Visible)
{
PlayerVisibility = AudioOnly ? PlayerVisibilityState.Minimal : PlayerVisibilityState.Visible;
PlayerVisibility = shouldBeVisible ? PlayerVisibilityState.Visible : PlayerVisibilityState.Minimal;
}

if (AudioOnly)
{
// If it's audio only, don't resize on next video playback
_resizeNext = false;
}
}
else if (PlayerVisibility == PlayerVisibilityState.Minimal)
Expand Down Expand Up @@ -598,5 +635,37 @@ private void OnPositionChanged(IMediaPlayer sender, object? args)
_lastPositionTracker.RemovePosition(Media.Location);
}
}

private void OnNaturalVideoSizeChanged(IMediaPlayer sender, EventArgs args)
{
if (!_resizeNext && _settingsService.PlayerAutoResize != PlayerAutoResizeOption.Always) return;
_resizeNext = false;

_dispatcherQueue.TryEnqueue(() =>
{
if (ResizeWindow(1)) return;

// Resize to fill the screen only when video size is bigger than max window size
Size maxWindowSize = _windowService.GetMaxWindowSize();
if (sender.NaturalVideoWidth >= maxWindowSize.Width ||
sender.NaturalVideoHeight >= maxWindowSize.Height)
ResizeWindow();
});
}

private bool ResizeWindow(double scalar = 0)
{
if (_mediaPlayer == null || scalar < 0 || _windowService.ViewMode != WindowViewMode.Default) return false;
Size videoDimension = new(_mediaPlayer.NaturalVideoWidth, _mediaPlayer.NaturalVideoHeight);
double actualScalar = _windowService.ResizeWindow(videoDimension, scalar);
if (actualScalar > 0)
{
string status = _resourceService.GetString(ResourceName.ScaleStatus, $"{actualScalar * 100:0.##}%");
Messenger.Send(new UpdateStatusMessage(status));
return true;
}

return false;
}
}
}
9 changes: 1 addition & 8 deletions Screenbox/Controls/PlayerElement.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,6 @@
IsTabStop="False"
KeyboardAcceleratorPlacementMode="Hidden"
MediaPlayer="{x:Bind ViewModel.VlcPlayer}"
SizeChanged="{x:Bind ViewModel.OnSizeChanged}">
<local:VideoView.KeyboardAccelerators>
<KeyboardAccelerator Key="Number1" Invoked="{x:Bind ViewModel.OnResizeAcceleratorInvoked}" />
<KeyboardAccelerator Key="Number2" Invoked="{x:Bind ViewModel.OnResizeAcceleratorInvoked}" />
<KeyboardAccelerator Key="Number3" Invoked="{x:Bind ViewModel.OnResizeAcceleratorInvoked}" />
<KeyboardAccelerator Key="Number4" Invoked="{x:Bind ViewModel.OnResizeAcceleratorInvoked}" />
</local:VideoView.KeyboardAccelerators>
</local:VideoView>
SizeChanged="{x:Bind ViewModel.OnSizeChanged}" />
</Grid>
</UserControl>
4 changes: 4 additions & 0 deletions Screenbox/Pages/PlayerPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@
Modifiers="Shift" />
<KeyboardAccelerator Key="{x:Bind pages:PlayerPage.PeriodKey}" Invoked="{x:Bind ViewModel.OnFrameJumpKeyboardAcceleratorInvoked}" />
<KeyboardAccelerator Key="{x:Bind pages:PlayerPage.CommaKey}" Invoked="{x:Bind ViewModel.OnFrameJumpKeyboardAcceleratorInvoked}" />
<KeyboardAccelerator Key="Number1" Invoked="{x:Bind ViewModel.OnResizeKeyboardAcceleratorInvoked}" />
<KeyboardAccelerator Key="Number2" Invoked="{x:Bind ViewModel.OnResizeKeyboardAcceleratorInvoked}" />
<KeyboardAccelerator Key="Number3" Invoked="{x:Bind ViewModel.OnResizeKeyboardAcceleratorInvoked}" />
<KeyboardAccelerator Key="Number4" Invoked="{x:Bind ViewModel.OnResizeKeyboardAcceleratorInvoked}" />
<KeyboardAccelerator Key="NumberPad0" Invoked="{x:Bind ViewModel.OnPercentJumpKeyboardAcceleratorInvoked}" />
<KeyboardAccelerator Key="NumberPad1" Invoked="{x:Bind ViewModel.OnPercentJumpKeyboardAcceleratorInvoked}" />
<KeyboardAccelerator Key="NumberPad2" Invoked="{x:Bind ViewModel.OnPercentJumpKeyboardAcceleratorInvoked}" />
Expand Down
1 change: 1 addition & 0 deletions Screenbox/Pages/PlayerPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ protected override void OnNavigatedTo(NavigationEventArgs e)
{
LayoutRoot.Transitions.Clear();
ViewModel.PlayerVisibility = PlayerVisibilityState.Visible;
ViewModel.OnFileLaunched();
_startup = true;
}
}
Expand Down

0 comments on commit a723ee3

Please sign in to comment.