Skip to content

Commit

Permalink
- add with/not with validation display
Browse files Browse the repository at this point in the history
- update UI when moving members
  • Loading branch information
kurekmartin committed Jul 23, 2024
1 parent 0a91bfc commit 8282bc5
Show file tree
Hide file tree
Showing 8 changed files with 165 additions and 117 deletions.
3 changes: 2 additions & 1 deletion TeamSorting/Converters/MemberCombinationValidityConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ public class MemberCombinationValidityConverter : IValueConverter
{
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
return value is false ? Brushes.Tomato : Brushes.Transparent;
var color = value is false ? Brushes.Tomato.Color : Brushes.Transparent.Color;
return new SolidColorBrush(color);
}

public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
Expand Down
57 changes: 36 additions & 21 deletions TeamSorting/Models/Member.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
using Avalonia.Collections;
using System.Collections.Specialized;
using Avalonia.Collections;
using ReactiveUI;

namespace TeamSorting.Models;

public class Member(string name)
public class Member(string name) : ReactiveObject
{
public string Name { get; set; } = name;
public Dictionary<string, bool> With { get; } = [];
public Dictionary<string, bool> NotWith { get; } = [];
public List<string> With { get; } = [];
public Dictionary<string, bool> WithValidation => ValidateWith();
public List<string> NotWith { get; } = [];
public Dictionary<string, bool> NotWithValidation => ValidateNotWith();
public AvaloniaDictionary<Guid, DisciplineRecord> Records { get; } = [];

private Team? _team;
Expand All @@ -18,22 +22,31 @@ public Team? Team
{
if (_team == value) return;
_team = value;
Validate();
if (_team is null) return;
_team.Members.CollectionChanged += MembersOnCollectionChanged;
this.RaisePropertyChanged(nameof(WithValidation));
this.RaisePropertyChanged(nameof(NotWithValidation));
}
}

private void MembersOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
this.RaisePropertyChanged(nameof(WithValidation));
this.RaisePropertyChanged(nameof(NotWithValidation));
}

public bool IsValid
{
get
{
return With.Values.All(val => val == true)
&& NotWith.Values.All(val => val == true);
return WithValidation.Values.All(val => val)
&& NotWithValidation.Values.All(val => val);
}
}

public void AddWithMember(string member)
{
With.Add(member, false);
With.Add(member);
}

public void AddWithMembers(IEnumerable<string> members)
Expand All @@ -46,7 +59,7 @@ public void AddWithMembers(IEnumerable<string> members)

public void AddNotWithMember(string member)
{
NotWith.Add(member, false);
NotWith.Add(member);
}

public void AddNotWithMembers(IEnumerable<string> members)
Expand All @@ -57,26 +70,28 @@ public void AddNotWithMembers(IEnumerable<string> members)
}
}

public void Validate()
{
ValidateWith();
ValidateNotWith();
}

private void ValidateWith()
private Dictionary<string, bool> ValidateWith()
{
foreach (string withMember in With.Keys)
Dictionary<string, bool> dict = [];
foreach (string withMember in With)
{
With[withMember] = Team?.Members.Any(member => member.Name == withMember) ?? false;
bool value = Team?.Members.Any(member => member.Name == withMember) ?? false;
dict.Add(withMember, value);
}

return dict;
}

private void ValidateNotWith()
private Dictionary<string, bool> ValidateNotWith()
{
foreach (string notWithMember in NotWith.Keys)
Dictionary<string, bool> dict = [];
foreach (string notWithMember in NotWith)
{
NotWith[notWithMember] = Team?.Members.All(member => member.Name != notWithMember) ?? false;
bool value = Team?.Members.All(member => member.Name != notWithMember) ?? false;
dict.Add(notWithMember, value);
}

return dict;
}

public DisciplineRecord GetRecord(DisciplineInfo discipline)
Expand Down
34 changes: 20 additions & 14 deletions TeamSorting/Models/Team.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,24 @@
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using ReactiveUI;

namespace TeamSorting.Models;

public class Team(string name)
public class Team : ReactiveObject
{
public string Name { get; set; } = name;
public Team(string name)
{
Name = name;
Members.CollectionChanged += MembersOnCollectionChanged;
}

private void MembersOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
this.RaisePropertyChanged(nameof(IsValid));
this.RaisePropertyChanged(nameof(TotalScores));
}

public string Name { get; set; }
public ObservableCollection<Member> Members { get; } = [];

public bool IsValid
Expand All @@ -24,23 +38,15 @@ public void AddMember(Member member)
{
member.Team = this;
Members.Add(member);
ValidateTeamMembers();
}

private void ValidateTeamMembers()
{
foreach (var member in Members)
{
member.Validate();
}
}


public void RemoveMember(Member member)
{
member.Team = null;
Members.Remove(member);
}

public Dictionary<DisciplineInfo, double> TotalScores
{
get
Expand All @@ -67,8 +73,8 @@ public static (List<string> invalidWith, List<string> invalidNotWith) GetInvalid
{
var memberList = members.ToList();
var memberNames = memberList.Select(member => member.Name).ToList();
var with = memberList.SelectMany(member => member.With.Keys).ToList();
var notWith = memberList.SelectMany(member => member.NotWith.Keys);
var with = memberList.SelectMany(member => member.With).ToList();
var notWith = memberList.SelectMany(member => member.NotWith);

return (with.Except(memberNames).ToList(), memberNames.Intersect(notWith).ToList());
}
Expand Down
3 changes: 1 addition & 2 deletions TeamSorting/Sorting/EvolutionSorter.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Collections.ObjectModel;
using Serilog;
using Serilog;
using TeamSorting.Extensions;
using TeamSorting.Models;

Expand Down
28 changes: 22 additions & 6 deletions TeamSorting/ViewModels/Data.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,34 @@
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Dynamic;
using System.Globalization;
using CsvHelper;
using ReactiveUI;
using TeamSorting.Models;

namespace TeamSorting.ViewModels;

public class Data
public class Data : ReactiveObject
{
public ObservableCollection<DisciplineInfo> Disciplines { get; } = [];

public ObservableCollection<Member> Members { get; } = [];

public ObservableCollection<Team> Teams { get; set; } = [];
private ObservableCollection<Team> _teams = [];

public ObservableCollection<Team> Teams
{
get => _teams;
set
{
_teams = value;
foreach (var team in _teams)
{
team.WhenAnyValue(t => t.TotalScores)
.Subscribe(x => this.RaisePropertyChanged(nameof(DisciplineDelta)));
}
}
}

public Dictionary<DisciplineInfo, double> DisciplineDelta
{
Expand Down Expand Up @@ -167,7 +183,7 @@ public List<Member> InvalidMembersCombination()
{
newMembersAdded = false;
var newMembers = group[i..];
var withMembers = newMembers.SelectMany(member => GetMembersByName(member.With.Keys)).Distinct();
var withMembers = newMembers.SelectMany(member => GetMembersByName(member.With)).Distinct();
foreach (var withMember in withMembers)
{
if (group.Contains(withMember)) continue;
Expand All @@ -178,7 +194,7 @@ public List<Member> InvalidMembersCombination()
}
} while (newMembersAdded);

var notWithMembers = group.SelectMany(member => GetMembersByName(member.NotWith.Keys)).Distinct().ToList();
var notWithMembers = group.SelectMany(member => GetMembersByName(member.NotWith)).Distinct().ToList();
bool intersectExists = group.Intersect(notWithMembers).Any();
if (intersectExists)
{
Expand All @@ -198,7 +214,7 @@ public IEnumerable<Member> GetWithMembers(Member currentMember)
{
newMembersAdded = false;
var newMembers = group[i..];
var withMembers = newMembers.SelectMany(member => GetMembersByName(member.With.Keys)).Distinct();
var withMembers = newMembers.SelectMany(member => GetMembersByName(member.With)).Distinct();
foreach (var withMember in withMembers)
{
if (group.Contains(withMember)) continue;
Expand All @@ -215,7 +231,7 @@ public IEnumerable<Member> GetWithMembers(Member currentMember)
public IEnumerable<Member> GetNotWithMembers(Member currentMember)
{
List<Member> group = [];
var notWithMembers = GetMembersByName(currentMember.NotWith.Keys);
var notWithMembers = GetMembersByName(currentMember.NotWith);
foreach (var notWithMember in notWithMembers)
{
var allNotWithMembers = GetWithMembers(notWithMember).ToList();
Expand Down
4 changes: 2 additions & 2 deletions TeamSorting/Views/InputView.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
<DataGridTemplateColumn Header="With">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding With.Keys}">
<ItemsControl ItemsSource="{Binding With}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
Expand All @@ -73,7 +73,7 @@
<DataGridTemplateColumn Header="NotWith">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding NotWith.Keys}">
<ItemsControl ItemsSource="{Binding NotWith}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
Expand Down
Loading

0 comments on commit 8282bc5

Please sign in to comment.