示例#1
0
        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();
        }
示例#4
0
 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());
     }
 }
示例#5
0
        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);
        }
示例#7
0
 protected abstract Task HandleSubstitutionEvent(SubstitutionEvent @event, T outputSettings);
示例#8
0
 public Task HandleSubstitutionEvent(SubstitutionEvent @event, IOutput outputSettings)
 {
     return(HandleSubstitutionEvent(@event, CastSettings(outputSettings)));
 }
示例#9
0
        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));
 }
示例#11
0
        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));
        }
示例#12
0
        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);
        }
示例#14
0
 protected override Task HandleSubstitutionEvent(SubstitutionEvent @event, IFileOutput outputSettings)
 {
     return(WriteJson(@event.Substitutions, outputSettings, "substitutions.json"));
 }