Пример #1
0
        private void UpdateProgress(TableLayoutPanel tab)
        {
            var statuses = _appProgressTracker.GetAll().ToList();

            var existingStatuses = statuses
                                   .SelectMany(s => tab.Controls.OfType <Control>().Where(c => c.Name.StartsWith(s.Id)))
                                   .ToList();

            var controlsToRemove = tab.Controls.OfType <Control>().Except(existingStatuses)
                                   .ToList();

            var tasksToAdd = statuses.Where(s => !existingStatuses.Select(c => c.Name).Contains(s.Id))
                             .ToList();

            tab.SuspendLayout();

            var newControls = tasksToAdd
                              .SelectMany(p => _controlFactory.CreateProgress(p.Id, p.Name));

            foreach (var control in controlsToRemove)
            {
                tab.Controls.Remove(control);
            }

            foreach (var control in newControls)
            {
                control.Build(tab);
            }

            var controls = tab.Controls;

            foreach (var status in statuses)
            {
                var bar = controls.OfType <ProgressBar>().Single(c => c.Name == status.Id);
                bar.Minimum = 0;
                bar.Maximum = 100;
                bar.Value   = (int)(status.Progress * 100);

                var message = controls.OfType <Label>().Single(c => c.Name == status.Id + "Message");
                message.Text = status.Message;

                var percent = controls.OfType <Label>().Single(c => c.Name == status.Id + "Percent");
                percent.Text = $"{(int) (status.Progress * 100)}%";
            }

            tab.ResumeLayout();
        }