Exemplo n.º 1
0
        private void Visualizer_OnSelected(object sender, SelectionChangedEventArgs e)
        {
            if (_graphService == null || e.AddedItems.Count == 0)
            {
                return;
            }

            Func <VK.Model.User, IEnumerable <Tuple <long, string> > > infoExtractor = null;

            switch ((string)((ComboBoxItem)e.AddedItems[0]).Content)
            {
            case "По городу":
                infoExtractor = user => user.City == null ? new Tuple <long, string> [0] : new[] { Tuple.Create(user.City.Id, user.City.Title) };
                break;

            case "По университету":
                infoExtractor = user => user.Universities.Select(i => Tuple.Create(i.Id, i.Name));
                break;

            case "По школе":
                infoExtractor = user => user.Schools.Select(i => Tuple.Create(i.Id, i.Name));
                break;

            default:
                _model.VisualizationItems = null;
                _graphService.UpdateColors(false);
                return;
            }

            var brushes = new SolidColorBrush[]
            {
                Brushes.Red,
                Brushes.Yellow,
                Brushes.Orange,
                Brushes.Green,
                Brushes.Aqua,
                Brushes.Fuchsia,
                Brushes.LightPink,
                Brushes.Purple,
                Brushes.Lime,
                Brushes.Brown,
            };

            var distribution = _users.SelectMany(i => infoExtractor(i.Model))
                               .GroupBy(i => i.Item1)
                               .OrderByDescending(i => i.Count())
                               .Take(10)
                               .Select((i, v) => new
            {
                Id    = i.Key,
                Model = new MainWindowModel.VisualizationItemModel(i.First().Item2, brushes[v], i.Count())
            })
                               .ToDictionary(i => i.Id, i => i.Model);

            _model.VisualizationItems = distribution.Values.OrderByDescending(i => i.Count).ToArray();

            for (var i = 0; i < _users.Length; i++)
            {
                int   maxCount = int.MinValue;
                Color maxColor = default(Color);
                foreach (var item in infoExtractor(_users[i].Model))
                {
                    MainWindowModel.VisualizationItemModel model;
                    if (distribution.TryGetValue(item.Item1, out model) && model.Count > maxCount)
                    {
                        maxCount = model.Count;
                        maxColor = model.Brush.Color;
                    }
                }

                _users[i].Color = maxCount == int.MinValue
                    ? Color3.Black
                    : new Color3(maxColor.ScR, maxColor.ScG, maxColor.ScB);
            }

            _graphService.UpdateColors(true);
        }