public void TestCreateMonthReport ()
 {
     RunAsync (async delegate {
         var view = new SummaryReportView ();
         view.Period = ZoomLevel.Month;
         await view.Load (0);
         Assert.AreEqual (false, view.IsLoading);
         Assert.AreEqual (false, view.IsError);
         Assert.AreEqual (true, view.ActivityCount > 27);
         Assert.AreEqual (true, view.Projects.Count > 0);
         Assert.AreEqual (true, view.CollapsedProjects.Count > 0);
     });
 }
예제 #2
0
        public void Reset (SummaryReportView data)
        {
            this.data = data;

            // Cancel old animation
            if (currentRevealAnimation != null) {
                currentRevealAnimation.Cancel ();
                currentRevealAnimation = null;
            }
            if (currentSelectAnimation != null) {
                currentSelectAnimation.Cancel ();
                currentSelectAnimation = null;
            }

            var totalSlices = data == null || data.CollapsedProjects == null ? 0 : data.CollapsedProjects.Count;

            SetActiveSlice (-1, updateStats: false);
            backgroundView.Visibility = ViewStates.Visible;
            backgroundView.Radius = defaultRadius;

            ResetSlices (totalSlices);
            if (totalSlices > 0) {
                var totalTime = data.CollapsedProjects.Sum (x => x.TotalTime);
                var startAngle = 0f;

                for (var i = 0; i < totalSlices; i++) {
                    var slice = slices [i];
                    var project = data.CollapsedProjects [i];
                    var percentOfAll = (float)project.TotalTime / totalTime;

                    slice.Visibility = ViewStates.Gone;
                    slice.Radius = defaultRadius;
                    if (project.Color == ProjectModel.GroupedProjectColorIndex) {
                        slice.Color = Color.ParseColor (ProjectModel.GroupedProjectColor);
                    } else {
                        slice.Color = Color.ParseColor (ProjectModel.HexColors [project.Color % ProjectModel.HexColors.Length]);
                    }
                    slice.StartAngle = startAngle;
                    startAngle += percentOfAll * 360;
                }
            }

            // Detect state
            var isLoading = data == null || data.IsLoading;
            var isEmpty = !isLoading && totalSlices == 0;

            if (isLoading) {
                // Loading state
                loadingOverlayView.Visibility = ViewStates.Visible;
                loadingOverlayView.Alpha = 1f;

                emptyOverlayView.Visibility = ViewStates.Gone;
                statsOverlayView.Visibility = ViewStates.Gone;
            } else if (isEmpty) {
                // Error state
                loadingOverlayView.Visibility = ViewStates.Visible;
                loadingOverlayView.Alpha = 1f;

                emptyOverlayView.Visibility = ViewStates.Visible;
                emptyOverlayView.Alpha = 0f;

                statsOverlayView.Visibility = ViewStates.Gone;

                // Animate overlay in
                var scene = new AnimatorSet ();

                var fadeIn = ObjectAnimator.OfFloat (emptyOverlayView, "alpha", 0f, 1f).SetDuration (500);
                var fadeOut = ObjectAnimator.OfFloat (loadingOverlayView, "alpha", 1f, 0f).SetDuration (500);
                fadeOut.AnimationEnd += delegate {
                    loadingOverlayView.Visibility = ViewStates.Gone;
                };

                scene.Play (fadeOut);
                scene.Play (fadeIn).After (3 * fadeOut.Duration / 4);

                currentRevealAnimation = scene;
                scene.Start();
            } else {
                // Normal state
                var scene = new AnimatorSet ();

                // Fade loading message out
                statsOverlayView.Visibility = ViewStates.Visible;
                statsOverlayView.Alpha = 0f;

                var fadeOverlayOut = ObjectAnimator.OfFloat (loadingOverlayView, "alpha", 1f, 0f).SetDuration (500);
                fadeOverlayOut.AnimationEnd += delegate {
                    loadingOverlayView.Visibility = ViewStates.Gone;
                };
                scene.Play (fadeOverlayOut);

                var fadeOverlayIn = ObjectAnimator.OfFloat (statsOverlayView, "alpha", 0f, 1f).SetDuration (500);
                scene.Play (fadeOverlayIn).After (3 * fadeOverlayOut.Duration / 4);

                var donutReveal = ValueAnimator.OfFloat (0, 360);
                donutReveal.SetDuration (750);
                donutReveal.Update += (sender, e) => ShowSlices ((float)e.Animation.AnimatedValue);
                scene.Play (donutReveal).After (fadeOverlayOut.Duration / 2);

                currentRevealAnimation = scene;
                scene.Start();
            }

            UpdateStats ();
            RequestLayout ();
        }
예제 #3
0
        public async void LoadData()
        {
            if ( IsClean) {
                try {
                    IsLoading = true;
                    dataSource = new SummaryReportView ();
                    dataSource.Period = ZoomLevel;

                    _delaying = true;
                    cts = new CancellationTokenSource ();
                    await Task.Delay (500, cts.Token);
                    _delaying = false;

                    await dataSource.Load (TimeSpaceIndex);

                    if ( !dataSource.IsLoading) {
                        barChart.ReportView = dataSource;
                        pieChart.ReportView = dataSource;
                    }
                    IsClean = IsError; // Declare ReportView as clean if an error occurs..

                } catch (Exception ex) {
                    IsClean = true;
                } finally {
                    IsLoading = false;
                    _delaying = false;
                    cts.Dispose ();
                }
            }
        }
예제 #4
0
        public void Reset (SummaryReportView data)
        {
            // Cancel old animation
            if (currentAnimation != null) {
                currentAnimation.Cancel ();
                currentAnimation = null;
            }

            // Not zooming
            isZooming = false;

            var totalRows = 0;
            var hasTime = false;

            if (data == null) {
                backgroundView.XAxisLabels = null;
                ResetRows (totalRows);
            } else {
                var showEveryYLabel = 1;
                var showValueLabels = true;

                backgroundView.XAxisLabels = data.ChartTimeLabels.ToArray ();

                totalRows = Math.Min (data.Activity.Count, data.ChartRowLabels.Count);
                ResetRows (totalRows);

                if (totalRows > 25) {
                    showEveryYLabel = 3;
                    showValueLabels = false;
                }

                for (var i = 0; i < totalRows; i++) {
                    var activity = data.Activity [i];
                    var yLabel = data.ChartRowLabels [i];

                    if (activity.TotalTime > 0) {
                        hasTime = true;
                    }

                    var barWidth = (float)activity.TotalTime / (float) (data.MaxTotal * 3600);
                    var showYAxis = i % showEveryYLabel == 0;

                    // Bind the data to row
                    var row = rows [i];
                    row.RelativeWidth = barWidth;
                    row.BarView.BillableTime = activity.BillableTime;
                    row.BarView.TotalTime = activity.TotalTime;
                    row.ValueTextView.Text = activity.FormattedTotalTime;
                    row.ValueTextView.Visibility = showValueLabels ? ViewStates.Visible : ViewStates.Gone;
                    row.YAxisTextView.Text = yLabel;
                    row.YAxisTextView.Visibility = showYAxis ? ViewStates.Visible : ViewStates.Gone;
                }
            }

            // Detect state
            var isLoading = totalRows == 0 || (data != null && data.IsLoading);
            var isEmpty = !isLoading && !hasTime;

            if (isLoading) {
                // Loading state
                loadingOverlayView.Visibility = ViewStates.Visible;
                loadingOverlayView.Alpha = 1f;

                emptyOverlayView.Visibility = ViewStates.Gone;
            } else if (isEmpty) {
                // Error state
                loadingOverlayView.Visibility = ViewStates.Visible;
                loadingOverlayView.Alpha = 1f;

                emptyOverlayView.Visibility = ViewStates.Visible;
                emptyOverlayView.Alpha = 0f;

                // Animate overlay in
                var scene = new AnimatorSet ();

                var fadeIn = ObjectAnimator.OfFloat (emptyOverlayView, "alpha", 0f, 1f).SetDuration (500);
                var fadeOut = ObjectAnimator.OfFloat (loadingOverlayView, "alpha", 1f, 0f).SetDuration (500);
                fadeOut.AnimationEnd += delegate {
                    loadingOverlayView.Visibility = ViewStates.Gone;
                };

                scene.Play (fadeOut);
                scene.Play (fadeIn).After (3 * fadeOut.Duration / 4);

                currentAnimation = scene;
                scene.Start();
            } else {
                // Normal state
                var scene = new AnimatorSet ();

                // Fade loading message out
                var fadeOverlayOut = ObjectAnimator.OfFloat (loadingOverlayView, "alpha", 1f, 0f).SetDuration (500);
                fadeOverlayOut.AnimationEnd += delegate {
                    loadingOverlayView.Visibility = ViewStates.Gone;
                };

                scene.Play (fadeOverlayOut);

                foreach (var row in rows) {
                    var axisFadeIn = ObjectAnimator.OfFloat (row.YAxisTextView, "alpha", 0f, 1f).SetDuration (500);
                    var barScaleUp = ObjectAnimator.OfFloat (row.BarView, "scaleX", 0f, 1f).SetDuration (750);
                    var valueFadeIn = ObjectAnimator.OfFloat (row.ValueTextView, "alpha", 0f, 1f).SetDuration (400);

                    scene.Play (axisFadeIn);
                    scene.Play (barScaleUp).After (axisFadeIn.Duration / 2);
                    scene.Play (valueFadeIn).After (barScaleUp);
                }

                currentAnimation = scene;
                scene.Start();
            }

            RequestLayout ();
        }