/// <summary> /// Draw timeline (lines, times) /// </summary> public void Draw() { if (!AppState.TimelineManager.Visible) return; if (busy) return; if (cTimeLine == null || Timeline == null) return; busy = true; Begin(); // calculate diff TimeSpan dif = Timeline.End - Timeline.Start; //double w = cTimeLine.ActualWidth; //double th = dif.TotalSeconds; // determine interval cTimeLine.Children.Clear(); // if (clearEvents) //{ //aggregatedTimelineItems.Clear(); //cEvents.Children.Clear(); //} DateTime first = Rounding.RoundDateToMinuteInterval(Timeline.Start, Timeline.Interval, RoundingDirection.RoundUp); DateTime next = first; //var eventslist = new List<IEvent>(); UpdateCurrentTime(); //int rangeindex = 1; #region lines & times var ids = new List<string>(); if (Timeline.EventsVisible ) { RedrawTimer = AppState.TimelineManager.CurrentTime; var elist = new List<IEvent>(); var blist = new List<Border>(); foreach (var el in AppState.EventLists) { elist.AddRange(AppState.EventLists.Filter(el)); } elist = elist.OrderByDescending(k => k.TimeRange).ToList(); var categories = elist.Select(k => k.Category).Distinct().ToList(); foreach (var c in categories) { var clist = elist.Where(k => k.Category == c); //var maxparents = clist.Max(t=>clist.Count(k=>k.Date <= t.Date && k.Date.Add(k.TimeRange) >= t.Date.Add(t.TimeRange))); foreach (var e in elist.Where(k => k.Category == c)) { var y = 0; var x = Timeline.GetScreenPos(e.Date); var parents = elist.Where(k => k.Category == c && k.Date <= e.Date && k.Date.Add(k.TimeRange) >= e.Date.Add(e.TimeRange)); y = parents.Count(); var r = Timeline.GetRow(e.Category); if (r != null && r.Visible) { Border b = new Border() { BorderBrush = new SolidColorBrush(e.Color), Background = Brushes.Transparent, BorderThickness = new Thickness(2), CornerRadius = new CornerRadius(4), Width = 8, Height = 8, Tag = e.Id }; if (e.TimeRange != new TimeSpan()) { var x2 = Timeline.GetScreenPos(e.Date.Add(e.TimeRange)); if (x2 - x > 8) b.Width += (x2 - x) - 8; } b.MouseDown += (f, p) => { e.TriggerClicked(this, null); }; b.MouseEnter += (f, p) => { var item = new TimeItemViewModel() { Item = e, CustomItem = true }; var bt = ViewLocator.LocateForModel(item, null, null) as FrameworkElement; ViewModelBinder.Bind(item, bt, null); if (e.TimeRange != new TimeSpan()) bt.RenderTransform = new TranslateTransform(x + p.GetPosition(b).X, -55); else bt.RenderTransform = new TranslateTransform(x - 2, -55); ActiveEvent.Children.Add(bt); }; b.MouseLeave += (f, p) => { ActiveEvent.Children.Clear(); }; if (categories.Count() > 1) b.RenderTransform = new TranslateTransform(x - 4, r.ActualOrder * 7 + 5); else b.RenderTransform = new TranslateTransform(x - 4, 7 * y + r.ActualOrder * 7 + 5); blist.Add(b); } } } cEvents.Children.Clear(); foreach (var b in blist) { cEvents.Children.Add(b); } //var addlist = blist.Where(b => cEvents.Children.OfType<Border>().All(k => k.Tag != b.Tag)).ToList(); //var remlist = cEvents.Children.OfType<Border>().Where(b => blist.All(k => k.Tag != b.Tag)).ToList(); //foreach ( var b in addlist) // cEvents.Children.Add(b); //foreach ( var b in remlist) // cEvents.Children.Add(b); } while (next < Timeline.End) { string id = next.Ticks + "-" + next.AddSeconds(Timeline.Interval).Ticks; ids.Add(id); var l = new Line { X1 = Timeline.GetScreenPos(next),// (w/th)*((next - Timeline.Start).TotalSeconds), Y1 = 0, Y2 = gContent.ActualHeight - 1, StrokeThickness = DividerWidth, Stroke = Timeline.DividerBrush }; l.X2 = l.X1; cTimeLine.Children.Add(l); /* if (Timeline.EventsVisible) { //Events DateTime next2 = next.AddSeconds(Timeline.Interval); double x2 = Timeline.GetScreenPos(next); // (w/th)*((next2 - Timeline.Start).TotalSeconds); AggregatedTimelineItem at; if (aggregatedTimelineItems.ContainsKey(id)) { at = aggregatedTimelineItems[id]; double aWidth = x2 - l.X1; at.Width = aWidth; at.RenderTransform = new TranslateTransform(l.X1, 0); } else { at = new AggregatedTimelineItem { DividerWidth = DividerWidth, Height = 30, RenderTransform = new TranslateTransform(l.X1, 0) }; at.Childs.Children.Clear(); double aWidth = x2 - l.X1; at.Width = aWidth; cEvents.Children.Add(at); //var aggrevents = (from tli in timelineItems let ip = FindPos(tli.ItemDateTime) where ip >= l.X1 && ip < x2 select tli).ToList(); List<IEvent> aggrevents = (from tli in AppState.EventLists.FilteredList let ip = FindPos(tli.Date) let ip2 = FindPos(tli.Date.Add(tli.TimeRange)) where eventslist.All(g => g.Id != tli.Id) && ((ip >= l.X1 && ip < x2) || (ip < Math.Min(l.X1, -1) && ip2 >= l.X1 && ip2 < x2)) select tli).ToList(); eventslist.AddRange(aggrevents); foreach (IEvent e in aggrevents) { //var margin = FindPos(e.ItemDateTime) - l.X1 - at.Width/2.0; //var marginwidth = FindPos(e.ItemDateTime.Add(e.ItemRange)) - l.X1 - at.Width / 2.0; double margin = FindPos(e.Date) - l.X1; // -at.Width / 2.0; double marginwidth = FindPos(e.Date.Add(e.TimeRange)) - l.X1; // -at.Width / 2.0; var bord = new Border { CornerRadius = new CornerRadius(10.0), BorderBrush = new SolidColorBrush(Colors.Black), Background = new SolidColorBrush(Colors.White), BorderThickness = new Thickness(2), VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(-7, 0, 0, 0), Width = 10, Height = 10, Tag = e.Name, RenderTransform = new TranslateTransform(margin, 12) }; if (marginwidth != margin) { double width = marginwidth - margin + 10.0; bord.Width = width; bord.Height = 5; var tg = new TransformGroup(); tg.Children.Add(new TranslateTransform(FindPos(e.Date), 5 + rangeindex*7)); bord.CornerRadius = new CornerRadius(0.0); if (margin + width > aWidth) { //bord.Width = 100; //tg.Children.Add(new ScaleTransform(width/100, 1)); } bord.RenderTransform = tg; rangeindex++; } bord.MouseEnter += delegate(Object sender, MouseEventArgs te) { var tg = new TransformGroup(); //var width = marginwidth - margin + 10.0; if (bord.Width == 10) tg.Children.Add(new TranslateTransform(margin - 3, -20)); else { Point p = te.GetPosition(cEvents); tg.Children.Add(new TranslateTransform(p.X - l.X1, -20)); } //if (margin + width > aWidth) //{ // var p = te.GetPosition(at); // tg.Children.Add(new TranslateTransform(p.X,0)); //} at.bEvent.RenderTransform = tg; at.ShowEvent(e); //if (e.EventPoint.Latitude != 0 && e.EventPoint.Longitude != 0) if (e.Latitude != 0 && e.Longitude != 0) at.bZoom.Visibility = Visibility.Visible; else { at.bZoom.Visibility = Visibility.Collapsed; } te.Handled = true; }; bord.MouseLeave += delegate(Object sender, MouseEventArgs te) { at.RemoveLater(); te.Handled = true; }; bord.TouchEnter += delegate(Object sender, TouchEventArgs te) { at.bEvent.RenderTransform = new TranslateTransform(margin - 3, -20); at.ShowEvent(e); te.Handled = true; }; bord.TouchLeave += delegate(Object sender, TouchEventArgs te) { at.RemoveLater(); te.Handled = true; }; if (bord.Width > 10) { cEvents.Children.Add(bord); Panel.SetZIndex(bord, 99999); } else at.Childs.Children.Add(bord); } aggregatedTimelineItems.Add(id, at); } } */ if (Timeline.Interval <= 60) { var tbTime = new TextBlock(); tbTime.SetValue(Canvas.LeftProperty, l.X1 + 5); tbTime.SetValue(Canvas.BottomProperty, 22.0); tbTime.Foreground = Timeline.Foreground; tbTime.FontSize = 18.0; tbTime.IsHitTestVisible = false; tbTime.Text = next.ToString("HH:mm:ss"); cTimeLine.Children.Add(tbTime); var tbDate = new TextBlock(); tbDate.SetValue(Canvas.LeftProperty, l.X1 + 5); tbDate.SetValue(Canvas.BottomProperty, 10.0); tbDate.FontSize = 10.0; tbDate.Foreground = Timeline.Foreground; tbDate.Text = next.ToString("dd-MM"); tbDate.Opacity = 0.75; tbDate.IsHitTestVisible = false; cTimeLine.Children.Add(tbDate); } else if (Timeline.Interval < 86400) { var tbTime = new TextBlock(); tbTime.SetValue(Canvas.LeftProperty, l.X1 + 5); tbTime.SetValue(Canvas.BottomProperty, 22.0); tbTime.Foreground = Timeline.Foreground; tbTime.FontSize = 18.0; tbTime.IsHitTestVisible = false; tbTime.Text = next.ToShortTimeString(); // next.Hour + ":" + next.Minute; cTimeLine.Children.Add(tbTime); var tbDate = new TextBlock(); tbDate.SetValue(Canvas.LeftProperty, l.X1 + 5); tbDate.SetValue(Canvas.BottomProperty, 10.0); tbDate.FontSize = 10.0; tbDate.IsHitTestVisible = false; tbDate.Foreground = Timeline.Foreground; tbDate.Text = next.ToString("dd-MM"); tbDate.Opacity = 0.75; cTimeLine.Children.Add(tbDate); } else if (Timeline.Interval < 31536000) { var tbDate = new TextBlock(); tbDate.SetValue(Canvas.LeftProperty, l.X1 + 5); tbDate.SetValue(Canvas.BottomProperty, 15.0); tbDate.FontSize = 18.0; tbDate.IsHitTestVisible = false; tbDate.Foreground = Timeline.Foreground; tbDate.Text = next.ToString("dd-MM-yyyy"); cTimeLine.Children.Add(tbDate); } else { var tbDate = new TextBlock(); tbDate.SetValue(Canvas.LeftProperty, l.X1 + 5); tbDate.SetValue(Canvas.BottomProperty, 15.0); tbDate.FontSize = 18.0; tbDate.IsHitTestVisible = false; tbDate.Foreground = Timeline.Foreground; tbDate.Text = next.ToString("yyyy"); cTimeLine.Children.Add(tbDate); } next = next.AddSeconds(Timeline.Interval); } //List<string> tbr = aggregatedTimelineItems.Keys.Where(k => !ids.Contains(k)).ToList(); //foreach (string t in tbr) //{ // cEvents.Children.Remove(aggregatedTimelineItems[t]); // aggregatedTimelineItems.Remove(t); //} #endregion End(); busy = false; }
/// <summary> /// Jump to the actual location (not to the time) /// </summary> /// <param name="item"></param> public void JumpToLocation(TimeItemViewModel item) { if (item.Item == null) return; AppState.ViewDef.PanAndPoint(new Point(item.Item.Longitude, item.Item.Latitude)); }