public void LoadModel(TwitterUser user) { buttonRegistry = new Dictionary<TwitterUser, TwitterUserControl>(); entityCanvas.Children.Clear(); // TODO: not sure if we want this here - the user model should already have dictated what data we retrieved. int depth = int.Parse(depthTextBox.Text); var startControl = new TwitterUserControl(user) {Title = user.Name}; var trans = new ScaleTransform {ScaleX = 1.3, ScaleY = 1.3}; startControl.RenderTransform = trans; startControl.Color = Colors.Blue; entityCanvas.Children.Add(startControl); Canvas.SetLeft(startControl, entityCanvas.ActualWidth / 2); Canvas.SetTop(startControl, entityCanvas.ActualHeight / 2); buttonRegistry.Add(user, startControl); ICollection<TwitterUser> ringEntities = user.Friends; for (int i = 1; i <= depth; i++) { ringEntities = LoadRing(ringEntities, i); } MakeFriends(); infoBlock.Text = "Node Count: " + buttonRegistry.Count; }
TwitterUser[] LoadRing(ICollection<TwitterUser> ringEntities, int depth) { var nextRing = new List<TwitterUser>(); //1 radian = ~57.3 degrees //~6 radians / circle double radiusFactor = Convert.ToDouble(depth) * 1; double radius = 160 * radiusFactor; double stepConstant = .06 * Convert.ToDouble(spacingSlider.Value); double radianStep = stepConstant / Convert.ToDouble(ringEntities.Count); double radians = 0; infoBlock.Text = ringEntities.Count.ToString(); foreach (var entity in ringEntities) { Point point = CalculateRingPoint(radians, radius); Point relativePoint = TranslateRingPoint(point); var button = new TwitterUserControl(entity); button.Clicked += user_Clicked; button.Opacity = 1 / (Convert.ToDouble(depth) * .3); button.Title = entity.Name; Canvas.SetLeft(button, relativePoint.X); Canvas.SetTop(button, relativePoint.Y); entityCanvas.Children.Add(button); buttonRegistry.Add(entity, button); radians = radians + radianStep; } foreach (var entity in ringEntities) { foreach (var nextConnection in entity.Friends) { if (!buttonRegistry.ContainsKey(nextConnection)) { if (!nextRing.Contains(nextConnection)) { nextRing.Add(nextConnection); } } } } return nextRing.ToArray(); }