Inheritance: Caliburn.Micro.Screen
示例#1
0
        /// <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;
        }
示例#2
0
 /// <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));
 }