private void BuildTrackerProjectProgressChanged(object sender, BuildTrackerProjectProgressEventArgs e) { if (ShouldExitHandler(e)) { return; } foreach (var build in e.Builds) { var buildToUpdate = _builds.SingleOrDefault(b => b.Id == build.Id); if (buildToUpdate != null) { buildToUpdate.TryUpdate(e.Project.Name, build.Status, build.StartTime, build.EndTime, build.RunTime()); } else { _application.Dispatcher.Invoke(() => { var buildToAdd = _buildFactory.Create(e.Project.Name, build.Id, build.Branch, build.VersionNumber(), build.RequestedBy, build.Changes, build.Status, build.StartTime, build.EndTime, build.RunTime(), build.WebUrl); var time = new Tuple <DateTime, DateTime>(buildToAdd.EndTime ?? DateTime.MaxValue, buildToAdd.StartTime ?? DateTime.MaxValue); var times = _builds.Select(b => new Tuple <DateTime, DateTime>(b.EndTime ?? DateTime.MaxValue, b.StartTime ?? DateTime.MaxValue)).Concat(new[] { time }).OrderByDescending(t => t.Item1).ThenByDescending(t => t.Item2).ToArray(); var index = Array.IndexOf(times, time); _builds.Insert(index, buildToAdd); }); } } var buildsToKeep = e.Builds.Select(build => build.Id).ToArray(); var buildsToRemove = _builds.Where(build => !buildsToKeep.Contains(build.Id)).ToArray(); if (buildsToRemove.Any()) { _application.Dispatcher.Invoke(() => { _builds.RemoveRange(buildsToRemove); }); } IsErrored = false; IsBusy = false; NotifyOfPropertyChange(() => HasBuilds); NotifyOfPropertyChange(() => HasNoBuilds); NotifyOfPropertyChange(() => LatestBuild); NotifyOfPropertyChange(() => HasLatestBuild); NotifyOfPropertyChange(() => QueuedBuilds); NotifyOfPropertyChange(() => HasQueuedBuilds); NotifyOfPropertyChange(() => IsViewable); }
/// <summary> /// Initializes a new instance of the <see cref="BuildNotificationViewModel" /> class. /// </summary> /// <param name="application">The application.</param> /// <param name="buildViewModelFactory">The build view model factory.</param> /// <param name="project">The project.</param> /// <param name="build">The build.</param> public BuildNotificationViewModel(IApp application, IBuildViewModelFactory buildViewModelFactory, IProject project, IBuild build) { Ensure.That(application).IsNotNull(); Ensure.That(buildViewModelFactory).IsNotNull(); Ensure.That(project).IsNotNull(); Ensure.That(build).IsNotNull(); _application = application; Build = buildViewModelFactory.Create(project.Name, build.Id, build.Branch, build.VersionNumber(), build.RequestedBy, build.Changes, build.Status, build.StartTime, build.EndTime, build.RunTime(), build.WebUrl); StartClosing(); }