Skip to content

Commit

Permalink
Implement adding movies, series and movie series to movie series
Browse files Browse the repository at this point in the history
The implementation is not 100% tested yet.

 #30
  • Loading branch information
TolikPylypchuk committed Feb 4, 2020
1 parent 1131332 commit 7a5b4d2
Show file tree
Hide file tree
Showing 9 changed files with 169 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,9 @@ protected override async Task InsertAsync(
if (movieSeries.Entry != null)
{
var entry = movieSeries.Entry;
entry.Id = await connection.InsertAsync(entry, transaction);
entry.MovieSeriesId = movieSeries.Id;
entry.ParentSeriesId = entry.ParentSeries.Id;
entry.Id = await connection.InsertAsync(entry, transaction);
entry.ParentSeries.Entries.Add(entry);
}
}
Expand Down
3 changes: 2 additions & 1 deletion MovieList.Data/Services/Implementations/MovieService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@ protected override async Task InsertAsync(Movie movie, SqliteConnection connecti
if (movie.Entry != null)
{
var entry = movie.Entry;
entry.Id = await connection.InsertAsync(entry, transaction);
entry.MovieId = movie.Id;
entry.ParentSeriesId = entry.ParentSeries.Id;
entry.Id = await connection.InsertAsync(entry, transaction);
entry.ParentSeries.Entries.Add(entry);
}
}
Expand Down
3 changes: 2 additions & 1 deletion MovieList.Data/Services/Implementations/SeriesService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ protected override async Task InsertAsync(Series series, SqliteConnection connec
if (series.Entry != null)
{
var entry = series.Entry;
entry.Id = await connection.InsertAsync(entry, transaction);
entry.SeriesId = series.Id;
entry.ParentSeriesId = entry.ParentSeries.Id;
entry.Id = await connection.InsertAsync(entry, transaction);
entry.ParentSeries.Entries.Add(entry);
}
}
Expand Down
89 changes: 87 additions & 2 deletions MovieList.ViewModels/ViewModels/FileMainContentViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,27 @@ private MovieSeriesFormViewModel CreateMovieSeriesForm(MovieSeries movieSeries)
.Subscribe(detachedEntries.Add)
.DisposeWith(this.sideViewModelSubscriptions);

form.AddMovie
.Select(_ => form.MovieSeries)
.Select(this.CreateMovieForMovieSeries)
.Select(movie => new MovieListItem(movie))
.InvokeCommand<ListItem>(this.SelectItem)
.DisposeWith(this.sideViewModelSubscriptions);

form.AddSeries
.Select(_ => form.MovieSeries)
.Select(this.CreateSeriesForMovieSeries)
.Select(series => new SeriesListItem(series))
.InvokeCommand<ListItem>(this.SelectItem)
.DisposeWith(this.sideViewModelSubscriptions);

form.AddMovieSeries
.Select(_ => form.MovieSeries)
.Select(this.CreateMovieSeriesForMovieSeries)
.Select(ms => new MovieSeriesListItem(ms))
.InvokeCommand<ListItem>(this.SelectItem)
.DisposeWith(this.sideViewModelSubscriptions);

return form;
}

Expand Down Expand Up @@ -287,8 +308,8 @@ private void SubscribeToCommonCommands<TModel, TViewModel>(
return movieSeries;
})
.Select(this.CreateMovieSeriesForm)
.Subscribe(f => this.SideViewModel = f)
.Select(ms => new MovieSeriesListItem(ms))
.InvokeCommand<ListItem>(this.SelectItem)
.DisposeWith(this.sideViewModelSubscriptions);

form.GoToMovieSeries
Expand Down Expand Up @@ -435,6 +456,70 @@ private async Task GoToMovieSeriesEntryAsync(MovieSeriesEntry entry)
await this.List.ForceSelectedItem.Execute(Unit.Default);
}

private Movie CreateMovieForMovieSeries(MovieSeries parentSeries)
{
var entry = this.CreateEntryForMovieSeries(parentSeries);

var movie = new Movie
{
Titles = new List<Title>
{
new Title { Priority = 1, IsOriginal = false },
new Title { Priority = 1, IsOriginal = true }
},
Year = MovieDefaultYear,
Kind = this.Kinds.First(),
Entry = entry
};

entry.Movie = movie;

return movie;
}

private Series CreateSeriesForMovieSeries(MovieSeries parentSeries)
{
var entry = this.CreateEntryForMovieSeries(parentSeries);

var series = new Series
{
Titles = new List<Title>
{
new Title { Priority = 1, IsOriginal = false},
new Title { Priority = 1, IsOriginal = true}
},
Kind = this.Kinds.First(),
Entry = entry
};

entry.Series = series;

return series;
}

private MovieSeries CreateMovieSeriesForMovieSeries(MovieSeries parentSeries)
{
var entry = this.CreateEntryForMovieSeries(parentSeries);

var movieSeries = new MovieSeries { Entry = entry };

entry.MovieSeries = movieSeries;

return movieSeries;
}

private MovieSeriesEntry CreateEntryForMovieSeries(MovieSeries parentSeries)
=> new MovieSeriesEntry
{
ParentSeries = parentSeries,
SequenceNumber = parentSeries.Entries.Count == 0
? 1
: parentSeries.Entries.Select(e => e.SequenceNumber).Max() + 1,
DisplayNumber = parentSeries.Entries.Count == 0
? 1
: parentSeries.Entries.Select(e => e.DisplayNumber).Max() + 1
};

private void ClearEntryConnection(MovieSeriesEntry entry)
{
if (entry.Movie != null)
Expand Down
13 changes: 13 additions & 0 deletions MovieList.ViewModels/ViewModels/Forms/MovieSeriesFormViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive;
using System.Reactive.Concurrency;
using System.Reactive.Disposables;
using System.Reactive.Linq;
Expand Down Expand Up @@ -71,6 +72,15 @@ public MovieSeriesFormViewModel(

this.DetachEntry = ReactiveCommand.Create<MovieSeriesEntry, MovieSeriesEntry>(this.OnDetachEntry);

var canAddEntry = Observable.CombineLatest(
Observable.Return(!this.IsNew).Merge(this.Save.Select(_ => true)),
this.FormChanged.Invert())
.AllTrue();

this.AddMovie = ReactiveCommand.Create(() => { }, canAddEntry);
this.AddSeries = ReactiveCommand.Create(() => { }, canAddEntry);
this.AddMovieSeries = ReactiveCommand.Create(() => { }, canAddEntry);

this.WhenAnyValue(vm => vm.HasTitles)
.BindTo(this, vm => vm.ShowTitles);

Expand Down Expand Up @@ -111,6 +121,9 @@ public ReadOnlyObservableCollection<MovieSeriesEntryViewModel> Entries

public ReactiveCommand<MovieSeriesEntryViewModel, MovieSeriesEntry> SelectEntry { get; }
public ReactiveCommand<MovieSeriesEntry, MovieSeriesEntry> DetachEntry { get; }
public ReactiveCommand<Unit, Unit> AddMovie { get; }
public ReactiveCommand<Unit, Unit> AddSeries { get; }
public ReactiveCommand<Unit, Unit> AddMovieSeries { get; }

public override bool IsNew
=> this.MovieSeries.Id == default;
Expand Down
9 changes: 9 additions & 0 deletions MovieList/Properties/Messages.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions MovieList/Properties/Messages.resx
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@
<data name="AddNewMovie" xml:space="preserve">
<value>Add new movie</value>
</data>
<data name="AddNewMovieSeries" xml:space="preserve">
<value>Add new movie series</value>
</data>
<data name="AddNewSeries" xml:space="preserve">
<value>Add new series</value>
</data>
Expand Down
30 changes: 30 additions & 0 deletions MovieList/Views/Forms/MovieSeriesFormControl.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,36 @@

<TextBox x:Name="PosterUrlTextBox" HorizontalAlignment="Stretch" Margin="0,8" m:HintAssist.Hint="{l:Translate PosterUrl}" />

<Grid Margin="0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<Grid.Resources>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource MaterialDesignOutlinedButton}">
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Margin" Value="4,0" />
<Setter Property="Height" Value="Auto" />
<Setter Property="MinHeight" Value="32" />
</Style>
</Grid.Resources>

<Button x:Name="AddMovieButton" Grid.Column="0">
<TextBlock Text="{l:Translate AddNewMovie, ToUpper=True}" TextAlignment="Center" TextWrapping="Wrap" />
</Button>

<Button x:Name="AddSeriesButton" Grid.Column="1">
<TextBlock Text="{l:Translate AddNewSeries, ToUpper=True}" TextAlignment="Center" TextWrapping="Wrap" />
</Button>
</Grid>

<Button x:Name="AddMovieSeriesButton" Style="{StaticResource MaterialDesignOutlinedButton}"
HorizontalAlignment="Center" Height="Auto" MinHeight="32" FontSize="12" Margin="8">
<TextBlock Text="{l:Translate AddNewMovieSeries, ToUpper=True}" TextAlignment="Center" TextWrapping="Wrap" />
</Button>

<Grid Margin="0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition />
Expand Down
21 changes: 21 additions & 0 deletions MovieList/Views/Forms/MovieSeriesFormControl.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,27 @@ private void BindCommands(CompositeDisposable disposables)
.BindTo(this, v => v.GoToPreviousButton.Visibility, useHidden, boolToVisibility)
.DisposeWith(disposables);

this.BindCommand(this.ViewModel, vm => vm.AddMovie, v => v.AddMovieButton)
.DisposeWith(disposables);

this.WhenAnyObservable(v => v.ViewModel.AddMovie.CanExecute)
.BindTo(this, v => v.AddMovieButton.Visibility, null, boolToVisibility)
.DisposeWith(disposables);

this.BindCommand(this.ViewModel, vm => vm.AddSeries, v => v.AddSeriesButton)
.DisposeWith(disposables);

this.WhenAnyObservable(v => v.ViewModel.AddSeries.CanExecute)
.BindTo(this, v => v.AddSeriesButton.Visibility, null, boolToVisibility)
.DisposeWith(disposables);

this.BindCommand(this.ViewModel, vm => vm.AddMovieSeries, v => v.AddMovieSeriesButton)
.DisposeWith(disposables);

this.WhenAnyObservable(v => v.ViewModel.AddMovieSeries.CanExecute)
.BindTo(this, v => v.AddMovieSeriesButton.Visibility, null, boolToVisibility)
.DisposeWith(disposables);

this.BindCommand(this.ViewModel, vm => vm.CreateMovieSeries, v => v.CreateMovieSeriesButton)
.DisposeWith(disposables);

Expand Down

0 comments on commit 7a5b4d2

Please sign in to comment.