protected virtual void UpdateCommonTagsPredicates() { if (Project == null) { return; } bool oldIgnoreEvents = ViewModel.Filters.IgnoreEvents; ViewModel.Filters.IgnoreEvents = true; ViewModel.CommonTagsPredicate.Clear(); var tags = Project.Dashboard.Model.CommonTagsByGroup; var listPredicates = new List <IPredicate <TimelineEventVM> > (); Expression <Func <TimelineEventVM, bool> > noTagsExpression = ev => true; foreach (var tagGroup in tags) { var tagsPredicates = new List <IPredicate <TimelineEventVM> > (); noTagsExpression = noTagsExpression.And(ev => !tagGroup.Value.Intersect(ev.Model.Tags).Any()); Expression <Func <TimelineEventVM, bool> > tagGroupExpression = ev => ev.Model.Tags.Any(tag => tag.Group == tagGroup.Key); var tagGroupPredicate = new OrPredicate <TimelineEventVM> { Name = string.IsNullOrEmpty(tagGroup.Key) ? "General tags" : tagGroup.Key, DisplayName = string.IsNullOrEmpty(tagGroup.Key) ? Catalog.GetString("General tags") : tagGroup.Key, }; tagsPredicates.Add(new Predicate { Name = "None", DisplayName = Catalog.GetString("None"), Expression = ev => !ev.Model.Tags.Any(tag => tag.Group == tagGroup.Key) }); foreach (var tag in tagGroup.Value) { tagsPredicates.Add(new Predicate { Name = tag.Value, DisplayName = tag.Value, Expression = tagGroupExpression.And(ev => ev.Model.Tags.Contains(tag)) }); } tagGroupPredicate.AddRange(tagsPredicates); listPredicates.Add(tagGroupPredicate); } ViewModel.CommonTagsPredicate.AddRange(listPredicates); ViewModel.Filters.IgnoreEvents = oldIgnoreEvents; if (!ViewModel.Filters.IgnoreEvents) { ViewModel.Filters.EmitPredicateChanged(); } }
protected override void UpdateTeamsPredicates() { bool oldIgnoreEvents = ViewModel.Filters.IgnoreEvents; ViewModel.Filters.IgnoreEvents = true; ViewModel.TeamsPredicate.Clear(); var teamsPredicates = new List <IPredicate <TimelineEventVM> > (); LMTimelineVM lmTimeline = (LMTimelineVM)ViewModel; LMTeamVM homeTeamVM = (LMTeamVM)lmTimeline.HomeTeamTimelineVM.Team; LMTeamVM awayTeamVM = (LMTeamVM)lmTimeline.AwayTeamTimelineVM.Team; teamsPredicates.Add(new Predicate { Name = Catalog.GetString("No team / player tagged"), Expression = ev => (!(ev.Model as LMTimelineEvent).Teams.Any() && !(ev.Model as LMTimelineEvent).Players.Any()) }); foreach (var team in new LMTeamVM [] { homeTeamVM, awayTeamVM }) { var playersPredicates = new List <IPredicate <TimelineEventVM> > (); var teamPredicate = new OrPredicate <TimelineEventVM> { Name = team.Name, }; playersPredicates.Add(new Predicate { Name = Catalog.GetString("Team tagged"), Expression = ev => (ev.Model as LMTimelineEvent).Teams.Contains(team.Model) }); foreach (var player in team) { playersPredicates.Add(new Predicate { Name = player.Model.Name, Expression = ev => (ev.Model as LMTimelineEvent).Players.Contains(player.Model) }); } teamPredicate.AddRange(playersPredicates); teamsPredicates.Add(teamPredicate); } ViewModel.TeamsPredicate.AddRange(teamsPredicates); ViewModel.Filters.IgnoreEvents = oldIgnoreEvents; if (!ViewModel.Filters.IgnoreEvents) { ViewModel.Filters.EmitPredicateChanged(); } }
protected virtual void UpdateEventTypesPredicates(object sender = null, NotifyCollectionChangedEventArgs e = null) { bool oldIgnoreEvents = ViewModel.Filters.IgnoreEvents; ViewModel.Filters.IgnoreEvents = true; UpdatePreviousPredicatesList(ViewModel.EventTypesPredicate); ViewModel.EventTypesPredicate.Clear(); var predicates = new List <IPredicate <TimelineEventVM> > (); foreach (var eventType in ViewModel.EventTypesTimeline) { IPredicate <TimelineEventVM> predicate; List <Tag> tagList = new List <Tag> (); Expression <Func <TimelineEventVM, bool> > eventTypeExpression = ev => ev.Model.EventType.Equals(eventType.Model); var analysisEventType = eventType.Model as AnalysisEventType; if (analysisEventType != null && analysisEventType.Tags.Any()) { CompositePredicate <TimelineEventVM> composedEventTypePredicate; var composedPredicates = new List <IPredicate <TimelineEventVM> > (); predicate = composedEventTypePredicate = new OrPredicate <TimelineEventVM> { Name = eventType.EventTypeVM.Name, DisplayName = eventType.EventTypeVM.Name, }; // We want subcategories to be flat, regardless of the group. foreach (var tagGroup in analysisEventType.TagsByGroup) { Expression <Func <TimelineEventVM, bool> > tagGroupExpression = ev => ev.Model.Tags.Any(tag => tag.Group == tagGroup.Key); foreach (var tag in tagGroup.Value) { composedPredicates.Add(new Predicate { Name = tag.Value, DisplayName = tag.Value, Expression = eventTypeExpression.And(tagGroupExpression.And(ev => ev.Model.Tags.Contains(tag))), Active = GetPreviousActiveValue(tag.Value) }); tagList.Add(tag); } } composedPredicates.Add(new Predicate { Name = "No subcategories", DisplayName = Catalog.GetString("No subcategories"), Expression = eventTypeExpression.And(ev => !ev.Model.Tags.Intersect(tagList).Any()), Active = GetPreviousActiveValue("No subcategories") }); composedEventTypePredicate.AddRange(composedPredicates); } else { predicate = new Predicate { Name = eventType.EventTypeVM.Name, DisplayName = eventType.EventTypeVM.Name, Expression = eventTypeExpression, Active = GetPreviousActiveValue(eventType.EventTypeVM.Name) }; } predicates.Add(predicate); } ViewModel.EventTypesPredicate.AddRange(predicates); ViewModel.Filters.IgnoreEvents = oldIgnoreEvents; if (!ViewModel.Filters.IgnoreEvents) { ViewModel.Filters.EmitPredicateChanged(); } }