public void Apply(SubstitutionEvent @event) { var playerId = @event.PlayerId; var substitutionPlayerId = @event.SubstitutionPlayerId; if (@event.Home) { var player = HomeTeam.Players.SingleOrDefault(x => x.Id == playerId); var substitutionPlayer = HomeTeam.Players.SingleOrDefault(x => x.Id == substitutionPlayerId); if (substitutionPlayer != null) { player.Bench = true; substitutionPlayer.Bench = false; } } else { var player = HomeTeam.Players.SingleOrDefault(x => x.Id == playerId); var substitutionPlayer = HomeTeam.Players.SingleOrDefault(x => x.Id == substitutionPlayerId); player.Bench = true; substitutionPlayer.Bench = false; } MatchEvents.Add(@event); }
public async Task LineupChanges_WhenCurrentTimeChanges_WithProject() { await ProjectSetUpAsync(); var outPlayer = teamTagger.HomeTeam.FieldPlayersList.FirstOrDefault(); var inPlayer = teamTagger.HomeTeam.BenchPlayersList.FirstOrDefault(); var substEvent = new SubstitutionEvent { In = inPlayer.TypedModel, Out = outPlayer.TypedModel, EventTime = new Time(10000), EventType = new SubstitutionEventType(), Name = "Test Subst" }; substEvent.Teams.Add(teamTagger.HomeTeam.Model); project.Timeline.Model.Add(substEvent); teamTagger.CurrentTime = new Time(0); Assert.AreSame(outPlayer, teamTagger.HomeTeam.FieldPlayersList.FirstOrDefault()); Assert.AreSame(inPlayer, teamTagger.HomeTeam.BenchPlayersList.FirstOrDefault()); teamTagger.CurrentTime = new Time(20000); Assert.AreSame(inPlayer, teamTagger.HomeTeam.FieldPlayersList.FirstOrDefault()); Assert.AreSame(outPlayer, teamTagger.HomeTeam.BenchPlayersList.FirstOrDefault()); }
void InitializeWithSubstitutionEvent() { var substitutionEvent = new SubstitutionEvent(); substitutionEvent.EventTime = new Time(1000); substitutionEvent.In = project.LocalTeamTemplate.Players [0]; substitutionEvent.Out = project.LocalTeamTemplate.Players [1]; substitutionEvent.Teams.Add(project.LocalTeamTemplate); viewModel.Play = substitutionEvent; StartControllers(); }
public static void Render(object item, int count, bool isExpanded, IDrawingToolkit tk, IContext context, Area backgroundArea, Area cellArea, CellState state) { if (item is EventType) { RenderAnalysisCategory(item as EventType, count, isExpanded, tk, context, backgroundArea, cellArea); } else if (item is SubstitutionEvent) { SubstitutionEvent s = item as SubstitutionEvent; RenderSubstitution(s.Color, s.EventTime, s.In, s.Out, s.Selected, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is TimelineEvent) { TimelineEvent p = item as TimelineEvent; RenderPlay(p.Color, p.Miniature, p.Players, p.Selected, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is Player) { RenderPlayer(item as Player, count, isExpanded, tk, context, backgroundArea, cellArea); } else if (item is Playlist) { RenderPlaylist(item as Playlist, count, isExpanded, tk, context, backgroundArea, cellArea); } else if (item is PlaylistPlayElement) { PlaylistPlayElement p = item as PlaylistPlayElement; RenderPlay(p.Play.EventType.Color, p.Miniature, null, p.Selected, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is IPlaylistElement) { IPlaylistElement p = item as IPlaylistElement; RenderPlay(Config.Style.PaletteActive, p.Miniature, null, p.Selected, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else { Log.Error("No renderer for type " + item.GetType()); } }
public void LoadSubstitution(Project project, SubstitutionEvent substitution) { List <Player> hfp, hbp, afp, abp; this.substitution = substitution; project.CurrentLineup(substitution.EventTime, out hfp, out hbp, out afp, out abp); playershbox.Visible = true; tagger.SubstitutionMode = false; tagger.ShowSubstitutionButtons = false; tagger.SelectionMode = MultiSelectionMode.Single; if (substitution.Team == TeamType.LOCAL) { LoadTeams(project, hfp, hbp, null, null); } else { LoadTeams(project, null, null, afp, abp); } SwitchPlayer(substitution.In, substitution.Out); }
public void TestTeamTaggerUpdatesWhenSettingProjectAndSubstitutionEvent() { var lmProject = Utils.CreateProject(); var substitutionEvent = new SubstitutionEvent(); substitutionEvent.EventTime = new Time(1000); substitutionEvent.In = lmProject.LocalTeamTemplate.Players [0]; substitutionEvent.Out = lmProject.LocalTeamTemplate.Players [1]; substitutionEvent.Teams.Add(lmProject.LocalTeamTemplate); viewModel.Project = new LMProjectVM { Model = lmProject }; viewModel.Play = substitutionEvent; Assert.AreSame(viewModel.TeamTagger.HomeTeam, viewModel.Project.HomeTeam); Assert.IsNull(viewModel.TeamTagger.AwayTeam); Assert.AreSame(substitutionEvent.In, viewModel.InPlayer.Model); Assert.AreSame(substitutionEvent.Out, viewModel.OutPlayer.Model); Assert.AreEqual(substitutionEvent.EventTime, viewModel.TeamTagger.CurrentTime); Assert.IsFalse(viewModel.LineupMode); Assert.IsFalse(viewModel.TeamTagger.SubstitutionMode); Assert.AreSame(viewModel.TeamTagger.Background, lmProject.Dashboard.FieldBackground); }
protected abstract Task HandleSubstitutionEvent(SubstitutionEvent @event, T outputSettings);
public Task HandleSubstitutionEvent(SubstitutionEvent @event, IOutput outputSettings) { return(HandleSubstitutionEvent(@event, CastSettings(outputSettings))); }
public static void Render(object item, LMProject project, int count, bool isExpanded, IDrawingToolkit tk, IContext context, Area backgroundArea, Area cellArea, CellState state) { // HACK: to be remove when all treeviews are migrated to user VM's if (item is TimelineEventVM) { item = ((TimelineEventVM)item).Model; } else if (item is EventTypeTimelineVM) { item = ((EventTypeTimelineVM)item).Model; } else if (item is PlaylistElementVM) { item = ((PlaylistElementVM)item).Model; } else if (item is PlaylistVM) { item = ((PlaylistVM)item).Model; } else if (item is PlayerVM) { item = ((PlayerVM)item).Model; } else if (item is PlayerTimelineVM) { item = ((PlayerTimelineVM)item).Model; } if (item is EventType) { RenderAnalysisCategory(item as EventType, count, isExpanded, tk, context, backgroundArea, cellArea); } else if (item is SubstitutionEvent) { SubstitutionEvent s = item as SubstitutionEvent; RenderSubstitution(s.Color, s.EventTime, s.In, s.Out, s.Playing, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is TimelineEvent) { LMTimelineEvent p = item as LMTimelineEvent; // always add local first. RenderPlay(p.Color, p.Miniature, p.Players, p.Teams, p.Playing, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is Player) { RenderPlayer(item as LMPlayer, count, isExpanded, tk, context, backgroundArea, cellArea); } else if (item is Playlist) { RenderPlaylist(item as Playlist, count, isExpanded, tk, context, backgroundArea, cellArea); } else if (item is PlaylistPlayElement) { PlaylistPlayElement p = item as PlaylistPlayElement; RenderPlay(p.Play.EventType.Color, p.Miniature, null, null, p.Playing, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is IPlaylistElement) { IPlaylistElement p = item as IPlaylistElement; RenderPlay(App.Current.Style.PaletteActive, p.Miniature, null, null, p.Playing, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else { Log.Error("No renderer for type " + item.GetType()); } }
private void HandleSubstitutionEvent(SubstitutionEvent obj) { Handle("substitution", (handler, settings) => handler.HandleSubstitutionEvent(obj, settings)); }
void UpdateTimePlayed() { LineupEvent lineup = project.Lineup; List <SubstitutionEvent> subs; Time start; List <TimeNode> timenodes, playingTimeNodes; TimeNode last; subs = project.EventsByType(project.SubstitutionsEventType). Where(s => !(s is LineupEvent) && ((s as SubstitutionEvent).In == Player || (s as SubstitutionEvent).Out == Player)) .OrderBy(e => e.EventTime).Select(e => e as SubstitutionEvent).ToList(); if (lineup.AwayStartingPlayers.Contains(Player) || lineup.HomeStartingPlayers.Contains(Player)) { start = lineup.EventTime; } else { SubstitutionEvent sub = subs.Where(s => s.In == Player).FirstOrDefault(); if (sub == null) { TimePlayed = new Time(0); return; } else { start = sub.EventTime; } } timenodes = new List <TimeNode> (); /* Find the sequences of playing time */ last = new TimeNode { Start = start }; timenodes.Add(last); if (subs.Count == 0) { last.Stop = project.Description.FileSet.Duration; } else { foreach (SubstitutionEvent sub in subs) { if (last.Stop == null) { if (sub.Out == Player) { last.Stop = sub.EventTime; } } else { if (sub.In == Player) { last = new TimeNode { Start = sub.EventTime }; timenodes.Add(last); } } } } /* If the last substitution was Player IN */ if (last.Stop == null) { last.Stop = project.Description.FileSet.Duration; } playingTimeNodes = new List <TimeNode> (); /* Get the real playing time intersecting with the periods */ foreach (TimeNode timenode in timenodes) { foreach (Period p in project.Periods) { if (p.PeriodNode.Intersect(timenode) != null) { foreach (TimeNode ptn in p.Nodes) { TimeNode res = ptn.Intersect(timenode); if (res != null) { playingTimeNodes.Add(res); } } } } } TimePlayed = new Time(playingTimeNodes.Sum(t => t.Duration.MSeconds)); }
public static void Render(object item, LMProject project, int count, bool isExpanded, IDrawingToolkit tk, IContext context, Area backgroundArea, Area cellArea, CellState state) { //Get the offset to properly calulate if needs tooltip or redraw offsetX = backgroundArea.Right - cellArea.Right; offsetY = cellArea.Top - backgroundArea.Top; bool playing = (item as IPlayable)?.Playing ?? false; // HACK: to be remove when all treeviews are migrated to user VM's if (item is TimelineEventVM) { item = ((TimelineEventVM)item).Model; } else if (item is EventTypeTimelineVM) { var vm = item as EventTypeTimelineVM; RenderAnalysisCategory(vm, count, isExpanded, tk, context, backgroundArea, cellArea, state); return; } else if (item is PlaylistElementVM) { item = ((PlaylistElementVM)item).Model; } else if (item is PlaylistVM) { item = ((PlaylistVM)item).Model; } else if (item is PlayerVM) { item = ((PlayerVM)item).Model; } else if (item is PlayerTimelineVM) { item = ((PlayerTimelineVM)item).Model; } // FIXME: This first if case must be deleted when presentations is migrated to MVVMC if (item is EventType) { RenderAnalysisCategory(item as EventType, count, isExpanded, tk, context, backgroundArea, cellArea); } else if (item is SubstitutionEvent) { SubstitutionEvent s = item as SubstitutionEvent; RenderSubstitution(s.Color, s.EventTime, s.In, s.Out, playing, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is TimelineEvent) { LMTimelineEvent p = item as LMTimelineEvent; // always add local first. RenderPlay(p.Color, p.Miniature, p.Players, p.Teams, playing, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is Player) { RenderPlayer(item as LMPlayer, count, isExpanded, tk, context, backgroundArea, cellArea); } else if (item is Playlist) { RenderPlaylist(item as Playlist, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is PlaylistPlayElement) { PlaylistPlayElement p = item as PlaylistPlayElement; RenderPlay(p.Play.EventType.Color, p.Miniature, null, null, playing, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else if (item is IPlaylistElement) { IPlaylistElement p = item as IPlaylistElement; RenderPlay(App.Current.Style.ThemeContrastDisabled, p.Miniature, null, null, playing, p.Description, count, isExpanded, tk, context, backgroundArea, cellArea, state); } else { Log.Error("No renderer for type " + item?.GetType()); } }
protected override async Task HandleSubstitutionEvent(SubstitutionEvent @event, IIccOutput outputSettings) { Configure(outputSettings); tuitionResolver.Initialize(); var substitutions = @event.Substitutions.Select(substitution => { /** * Retrieve study groups by checking the subject (if any) and every given grade. */ var studyGroups = new List <string>(); foreach (var grade in substitution.Grades) { string tuition = null; if (!string.IsNullOrEmpty(substitution.Subject)) { tuition = tuitionResolver.ResolveStudyGroup(grade, substitution.Subject, substitution.Teachers.FirstOrDefault()); } if (tuition == null) { tuition = tuitionResolver.ResolveStudyGroup(grade); } if (tuition != null) { studyGroups.Add(tuition); } else { logger.LogDebug($"Did not find tuition for grade '{grade}' and subject '{substitution.Subject}'."); } } // Remove duplicates studyGroups = studyGroups.Distinct().ToList(); if (substitution.Grades.Count > 0 && studyGroups.Count == 0) { logger.LogError($"Cannot resolve any tuition with subject '{substitution.Subject}' for grade [{string.Join(",", substitution.Grades)}]. Skip substitution."); return(null); } /** * Resolve replacement grades only by their name (because the new subject must not be a valid tuition) */ var replacementStudyGroups = new List <string>(); foreach (var grade in substitution.ReplacementGrades) { string tuition = null; if (!string.IsNullOrEmpty(substitution.ReplacementSubject)) { tuition = tuitionResolver.ResolveStudyGroup(grade, substitution.ReplacementSubject, substitution.Teachers.FirstOrDefault()); } if (tuition == null) { tuition = tuitionResolver.ResolveStudyGroup(grade); } if (tuition != null) { replacementStudyGroups.Add(tuition); } } return(new SubstitutionData { Id = substitution.Id.ToString(), Date = substitution.Date, LessonStart = substitution.LessonStart + (substitution.IsSupervision ? 1 : 0), // advance start lesson by 1 if it is a supervision LessonEnd = substitution.LessonEnd, Type = substitution.Type, Teachers = substitution.Teachers.ToList(), ReplacementTeachers = substitution.ReplacementTeachers.ToList(), Room = substitution.Room, ReplacementRoom = substitution.ReplacementRoom, Remark = substitution.Remark, StartsBefore = substitution.IsSupervision, StudyGroups = studyGroups, ReplacementStudyGroups = replacementStudyGroups, Subject = substitution.Subject, ReplacementSubject = substitution.ReplacementSubject }); }).Where(x => x != null); try { var result = substitutions.ToList(); } catch (Exception e) { logger.LogError(e, "Failed to compute substitutions."); } var response = await iccImporter.ImportSubstitutionsAsync(substitutions.ToList()); await HandleResponseAsync(response); }
protected override Task HandleSubstitutionEvent(SubstitutionEvent @event, IFileOutput outputSettings) { return(WriteJson(@event.Substitutions, outputSettings, "substitutions.json")); }