Finish the footer
continuous-integration/drone/push Build is passing Details

pull/37/head
Corentin LEMAIRE 2 years ago
parent b61e56fe5f
commit 91c2a51d9f

@ -5,7 +5,7 @@ namespace Linaris;
public partial class App : Application
{
public Manager Manager = new(new LinqXmlSerialization(Path.Combine(FileSystem.Current.AppDataDirectory, "Data")));
public Manager Manager = new(new LinqXmlSerialization(FileSystem.Current.AppDataDirectory));
public App()
{

@ -1,20 +1,40 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Linaris"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:model="clr-namespace:Model;assembly=Model"
x:Class="Linaris.FooterPage">
<Grid Grid.ColumnSpan="2" Grid.Row="1" BackgroundColor="Gray" ColumnDefinitions="16*,7*">
<Grid Grid.ColumnSpan="2" Grid.Row="1" BackgroundColor="Gray">
<toolkit:MediaElement x:Name="music" Source="{Binding Path}" BackgroundColor="Transparent" ShouldShowPlaybackControls="True" ShouldAutoPlay="True" Grid.Column="0" Speed="1" ShouldKeepScreenOn="false" MediaEnded="OnCompleted"/>
<toolkit:MediaElement IsVisible="False" x:Name="music" Source="{Binding CurrentPlaying.Path}" BackgroundColor="Transparent" ShouldShowPlaybackControls="True" ShouldAutoPlay="True" Grid.Column="0" ShouldKeepScreenOn="false" MediaEnded="OnCompleted"/>
<Grid Grid.Column="1" HorizontalOptions="CenterAndExpand" RowDefinitions="*,*" ColumnDefinitions="*,*">
<ImageButton Style="{StaticResource FooterButton}" Clicked="ShuffleButton_Clicked" Source="rdm.png" Grid.Row="0" Grid.Column="0"/>
<ImageButton Style="{StaticResource FooterButton}" Clicked="LoopButton_Clicked" Source="loop.png" Grid.Row="0" Grid.Column="1"/>
<ImageButton Style="{StaticResource FooterButton}" Clicked="RewindButton_Clicked" Source="back.png" Grid.Row="1" Grid.Column="0"/>
<ImageButton Style="{StaticResource FooterButton}" Clicked="NextButton_Clicked" Source="next.png" Grid.Row="1" Grid.Column="1"/>
</Grid>
<Grid ColumnDefinitions="*,3*,*" RowDefinitions="8*,3*">
<Label Style="{StaticResource FooterTitleTrigger}" Text="{Binding CurrentPlaying.Name}" TextColor="PeachPuff" x:Name="Title" HorizontalOptions="Center" VerticalOptions="Center" LineBreakMode="TailTruncation" Grid.Row="0"/>
<Grid ColumnDefinitions="*,3*,*" Grid.ColumnSpan="3" RowDefinitions="8*,3*" Grid.RowSpan="2">
<HorizontalStackLayout Grid.Row="0" Grid.Column="1" HorizontalOptions="Center">
<ImageButton Style="{StaticResource FooterButton}" Clicked="LoopButton_Clicked" Source="loop.png"/>
<ImageButton Style="{StaticResource FooterButton}" Clicked="RewindButton_Clicked" Source="back.png"/>
<ImageButton Clicked="PlayButton_Clicked" WidthRequest="30" Source="{Binding Source={RelativeSource AncestorType={x:Type ContentView}}, Path=PlayImage}" Aspect="AspectFit" BackgroundColor="Transparent" Margin="0,10,8,10"/>
<ImageButton Style="{StaticResource FooterButton}" Clicked="NextButton_Clicked" Source="next.png"/>
<ImageButton Style="{StaticResource FooterButton}" Clicked="ShuffleButton_Clicked" Source="rdm.png"/>
</HorizontalStackLayout>
<Grid ColumnDefinitions="*,4*,*" Grid.Row="1" Style="{StaticResource FooterSliderTrigger}">
<Label Text="{Binding Source={RelativeSource AncestorType={x:Type ContentView}}, Path=Position}" Grid.Column="0" HorizontalTextAlignment="End" Margin="0,0,5,0" VerticalOptions="Center"/>
<Slider Value="{Binding Source={RelativeSource AncestorType={x:Type ContentView}}, Path=SliderPosition, Mode=TwoWay}" Grid.Column="1" x:Name="TimeSlider"/>
<Label Text="{Binding Source={RelativeSource AncestorType={x:Type ContentView}}, Path=Duration}" Grid.Column="2" Margin="5,0,0,0" VerticalOptions="Center"/>
</Grid>
</Grid>
<VerticalStackLayout Style="{StaticResource FooterVolumeTrigger}" Grid.Column="2" VerticalOptions="Center">
<Image Source="volume.png" WidthRequest="35" HeightRequest="35"/>
<Slider Value="{Binding Source={RelativeSource AncestorType={x:Type ContentView}}, Path=Volume}" x:Name="VolumeSlider" WidthRequest="100" VerticalOptions="Center" Margin="5,0,0,0"/>
</VerticalStackLayout>
</Grid>
</Grid>
</ContentView>

@ -1,21 +1,133 @@
using CommunityToolkit.Maui.Core.Primitives;
using Model;
using Model.Stub;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace Linaris;
public partial class FooterPage : ContentView, INotifyPropertyChanged
{
private CustomTitle currentPlaying;
private readonly Manager Manager = (Application.Current as App).Manager;
public CustomTitle CurrentPlaying
{
get => currentPlaying;
set
{
currentPlaying = value;
OnPropertyChanged(nameof(CurrentPlaying));
}
}
private string playImage = "play.png";
public string PlayImage
{
get => playImage;
set
{
playImage = value;
OnPropertyChanged(nameof(PlayImage));
}
}
private double volume = 1;
public double Volume
{
get => volume;
set
{
volume = value;
OnPropertyChanged(nameof(Volume));
}
}
private string position = "00:00:00";
public string Position
{
get => position;
set
{
position = value;
OnPropertyChanged(nameof(Position));
}
}
private string duration = "00:00:00";
public string Duration
{
get => duration;
set
{
duration = value;
OnPropertyChanged(nameof(Duration));
}
}
private double sliderPosition = 0;
public double SliderPosition
{
get => sliderPosition;
set
{
sliderPosition = value;
OnPropertyChanged(nameof(SliderPosition));
}
}
private readonly Manager manager = (Application.Current as App).Manager;
public Manager Manager
{
get => manager;
}
public FooterPage()
{
InitializeComponent();
BindingContext = Manager.CurrentPlaying;
music.StateChanged += Music_StateChanged;
TimeSlider.ValueChanged += TimeSlider_ValueChanged;
VolumeSlider.ValueChanged += VolumeSlider_ValueChanged;
music.PositionChanged += Music_PositionChanged;
CurrentPlaying = Manager.CurrentPlaying;
BindingContext = this;
}
private void Music_PositionChanged(object sender, EventArgs e)
{
SliderPosition = music.Position.TotalSeconds / music.Duration.TotalSeconds;
Position = music.Position.ToString(@"hh\:mm\:ss");
}
private void VolumeSlider_ValueChanged(object sender, ValueChangedEventArgs e)
{
Volume = VolumeSlider.Value;
music.Volume = Volume;
}
private void TimeSlider_ValueChanged(object sender, ValueChangedEventArgs e)
{
TimeSpan PositionTimeSpan = TimeSpan.FromSeconds(TimeSlider.Value * music.Duration.TotalSeconds);
music.SeekTo(PositionTimeSpan);
Position = music.Position.ToString(@"hh\:mm\:ss");
}
private void Music_StateChanged(object sender, MediaStateChangedEventArgs e)
{
if (music.CurrentState == MediaElementState.Paused || music.CurrentState == MediaElementState.Stopped)
{
PlayImage = "play.png";
}
else
{
PlayImage = "pause.png";
Duration = music.Duration.ToString(@"hh\:mm\:ss");
}
}
public void RewindButton_Clicked(object sender, EventArgs e)
{
@ -23,7 +135,9 @@ public partial class FooterPage : ContentView, INotifyPropertyChanged
Manager.PreviousTitle();
Dispatcher.DispatchAsync(() =>
{
music.Source = Manager.CurrentPlaying.Path;
CurrentPlaying = Manager.CurrentPlaying;
music.Source = CurrentPlaying.Path;
Duration = music.Duration.ToString(@"hh\:mm\:ss");
});
}
@ -33,7 +147,9 @@ public partial class FooterPage : ContentView, INotifyPropertyChanged
Manager.NextTitle();
Dispatcher.DispatchAsync(() =>
{
music.Source = Manager.CurrentPlaying.Path;
CurrentPlaying = Manager.CurrentPlaying;
music.Source = CurrentPlaying.Path;
Duration = music.Duration.ToString(@"hh\:mm\:ss");
});
}
@ -53,7 +169,21 @@ public partial class FooterPage : ContentView, INotifyPropertyChanged
Manager.NextTitle();
Dispatcher.DispatchAsync(() =>
{
music.Source = Manager.CurrentPlaying.Path;
CurrentPlaying = Manager.CurrentPlaying;
music.Source = CurrentPlaying.Path;
Duration = music.Duration.ToString(@"hh\:mm\:ss");
});
}
public void PlayButton_Clicked(object sender, EventArgs e)
{
if (music.CurrentState == MediaElementState.Paused || music.CurrentState == MediaElementState.Stopped)
{
music.Play();
}
else
{
music.Pause();
}
}
}

@ -1,5 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0-android</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
@ -123,4 +122,6 @@
<Folder Include="Resources\Musics\" />
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties XamarinHotReloadDebuggerTimeoutExceptionLinarisHideInfoBar="True" /></VisualStudio></ProjectExtensions>
</Project>

@ -1,4 +1,5 @@
using CommunityToolkit.Maui.Views;
using Microsoft.Maui.Controls;
using Model;
using System.Collections.ObjectModel;
using System.Diagnostics;
@ -276,6 +277,10 @@ public partial class LocalFilesPage : ContentPage
{
musicElement.Source = customTitle.Path;
}
if (footer is FooterPage footerPage)
{
footerPage.CurrentPlaying = customTitle;
}
}
}
}

@ -46,6 +46,10 @@ public partial class PlaylistPage : ContentPage
if (Manager.CurrentPlaying == null) return;
musicElement.Source = Manager.CurrentPlaying.Path;
}
if (footer is FooterPage footerPage)
{
footerPage.CurrentPlaying = Manager.CurrentPlaying;
}
}
}
}

@ -361,6 +361,100 @@
</Setter>
</Style>
<Style TargetType="Label" x:Key="FooterTitleTrigger">
<Setter Property="VisualStateManager.VisualStateGroups">
<Setter.Value>
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="Narrow">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.RowSpan" Value="1"/>
<Setter Property="FontSize" Value="15"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Wide">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="600"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.RowSpan" Value="2"/>
<Setter Property="FontSize" Value="30"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="VerticalStackLayout" x:Key="FooterVolumeTrigger">
<Setter Property="VisualStateManager.VisualStateGroups">
<Setter.Value>
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="Narrow">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.RowSpan" Value="1"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Wide">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="600"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.RowSpan" Value="2"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Grid" x:Key="FooterSliderTrigger">
<Setter Property="VisualStateManager.VisualStateGroups">
<Setter.Value>
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="Narrow">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.ColumnSpan" Value="3"/>
<Setter Property="Grid.Column" Value="0"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Wide">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="600"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Property="Grid.ColumnSpan" Value="1"/>
<Setter Property="Grid.Column" Value="1"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="ImageButton" x:Key="FooterButton">
<Setter Property="Margin" Value="0,10,8,10"/>
<Setter Property="WidthRequest" Value="25"/>

@ -1,5 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0;net7.0-android</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>

@ -14,7 +14,7 @@ public class StubArtist
artists = new List<Artist>()
{
new Artist("Imagine Dragons"),
new Artist("Nepal"),
new Artist("Népal"),
new Artist("Hugo TSR"),
new Artist("Booba"),
new Artist("Oxmo Puccino"),

Loading…
Cancel
Save