void ReleaseDesignerOutlets()
        {
            if (CalendarContainer != null)
            {
                CalendarContainer.Dispose();
                CalendarContainer = null;
            }

            if (CalendarHeightConstraint != null)
            {
                CalendarHeightConstraint.Dispose();
                CalendarHeightConstraint = null;
            }

            if (ReportsTableView != null)
            {
                ReportsTableView.Dispose();
                ReportsTableView = null;
            }

            if (TopConstraint != null)
            {
                TopConstraint.Dispose();
                TopConstraint = null;
            }

            if (TopCalendarConstraint != null)
            {
                TopCalendarConstraint.Dispose();
                TopCalendarConstraint = null;
            }
        }
Пример #2
0
        void ReleaseDesignerOutlets()
        {
            if (BarChartsContainerView != null)
            {
                BarChartsContainerView.Dispose();
                BarChartsContainerView = null;
            }

            if (CalendarContainer != null)
            {
                CalendarContainer.Dispose();
                CalendarContainer = null;
            }

            if (OverviewContainerView != null)
            {
                OverviewContainerView.Dispose();
                OverviewContainerView = null;
            }

            if (ReportsTableView != null)
            {
                ReportsTableView.Dispose();
                ReportsTableView = null;
            }

            if (TopCalendarConstraint != null)
            {
                TopCalendarConstraint.Dispose();
                TopCalendarConstraint = null;
            }

            if (WorkspaceButton != null)
            {
                WorkspaceButton.Dispose();
                WorkspaceButton = null;
            }

            if (WorkspaceFadeView != null)
            {
                WorkspaceFadeView.Dispose();
                WorkspaceFadeView = null;
            }

            if (WorkspaceLabel != null)
            {
                WorkspaceLabel.Dispose();
                WorkspaceLabel = null;
            }

            if (ContentWidthConstraint != null)
            {
                ContentWidthConstraint.Dispose();
                ContentWidthConstraint = null;
            }
        }
Пример #3
0
        public void ScrollToTop()
        {
            if (ReportsTableView == null)
            {
                return;
            }

            var point = new CGPoint(0, -ReportsTableView.ContentInset.Top);

            ReportsTableView.SetContentOffset(point, true);
        }
        void ReleaseDesignerOutlets()
        {
            if (CalendarContainer != null)
            {
                CalendarContainer.Dispose();
                CalendarContainer = null;
            }

            if (CalendarHeightConstraint != null)
            {
                CalendarHeightConstraint.Dispose();
                CalendarHeightConstraint = null;
            }

            if (ReportsTableView != null)
            {
                ReportsTableView.Dispose();
                ReportsTableView = null;
            }

            if (TopCalendarConstraint != null)
            {
                TopCalendarConstraint.Dispose();
                TopCalendarConstraint = null;
            }

            if (TopConstraint != null)
            {
                TopConstraint.Dispose();
                TopConstraint = null;
            }

            if (WorkspaceButton != null)
            {
                WorkspaceButton.Dispose();
                WorkspaceButton = null;
            }

            if (WorkspaceLabel != null)
            {
                WorkspaceLabel.Dispose();
                WorkspaceLabel = null;
            }

            if (WorkspaceFadeView != null)
            {
                WorkspaceFadeView.Dispose();
                WorkspaceFadeView = null;
            }
        }
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            calendarSizeDisposable = CalendarContainer.AddObserver(boundsKey, NSKeyValueObservingOptions.New, onCalendarSizeChanged);

            source                  = new ReportsTableViewSource(ReportsTableView, ViewModel);
            source.OnScroll        += onReportsTableScrolled;
            ReportsTableView.Source = source;

            bool areThereEnoughWorkspaces(ICollection <(string ItemName, IThreadSafeWorkspace Item)> workspaces) => workspaces.Count > 1;

            bool isWorkspaceNameTooLong(string workspaceName)
            {
                var attributes = new UIStringAttributes {
                    Font = WorkspaceLabel.Font
                };
                var size = new NSString(workspaceName).GetSizeUsingAttributes(attributes);

                return(size.Width >= maximumWorkspaceNameLabelWidth);
            };

            //Text
            this.Bind(ViewModel.WorkspaceNameObservable, WorkspaceLabel.Rx().Text());
            this.Bind(ViewModel.CurrentDateRangeStringObservable, titleButton.Rx().Title());

            //Visibility
            this.Bind(ViewModel.WorkspacesObservable.Select(areThereEnoughWorkspaces), WorkspaceButton.Rx().IsVisible());
            this.Bind(ViewModel.WorkspaceNameObservable.Select(isWorkspaceNameTooLong), WorkspaceFadeView.Rx().FadeRight());

            //Commands
            this.BindVoid(titleButton.Rx().Tap(), ViewModel.ToggleCalendar);
            this.BindVoid(ReportsTableView.Rx().Tap(), ViewModel.HideCalendar);
            this.Bind(WorkspaceButton.Rx().Tap(), ViewModel.SelectWorkspace);

            var bindingSet = this.CreateBindingSet <ReportsViewController, ReportsViewModel>();

            bindingSet.Bind(source).To(vm => vm.Segments);

            bindingSet.Apply();
        }
Пример #6
0
        private void onReportsTableScrolled(object sender, CGPoint offset)
        {
            if (CalendarIsVisible)
            {
                var topConstant = (TopCalendarConstraint.Constant + offset.Y).Clamp(0, calendarHeight);
                TopCalendarConstraint.Constant = topConstant;

                if (topConstant == 0)
                {
                    return;
                }

                // we need to adjust the offset of the scroll view so that it doesn't fold
                // under the calendar while scrolling up
                var adjustedOffset = new CGPoint(offset.X, ReportsTableView.ContentOffset.Y - offset.Y);
                ReportsTableView.SetContentOffset(adjustedOffset, false);
                View.LayoutIfNeeded();

                if (topConstant == calendarHeight)
                {
                    HideCalendar();
                }
            }
        }
Пример #7
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            calendarViewController = ViewControllerLocator.GetViewController(ViewModel.CalendarViewModel) as ReportsCalendarViewController;
            prepareViews();

            OverviewContainerView.AddSubview(overview);
            overview.Frame = OverviewContainerView.Bounds;
            overview.Item  = ViewModel;
            BarChartsContainerView.AddSubview(barChart);
            barChart.Frame = BarChartsContainerView.Bounds;
            barChart.Item  = ViewModel;

            calendarSizeDisposable = CalendarContainer.AddObserver(boundsKey, NSKeyValueObservingOptions.New, onCalendarSizeChanged);

            source = new ReportsTableViewSource(ReportsTableView, ViewModel);
            source.SetItems(ImmutableList <ChartSegment> .Empty);
            ReportsTableView.ReloadData();

            ViewModel.SegmentsObservable
            .Subscribe(ReportsTableView.Rx().ReloadItems(source))
            .DisposedBy(DisposeBag);

            source.ScrolledWithHeaderOffset
            .Subscribe(onReportsTableScrolled)
            .DisposedBy(DisposeBag);

            ReportsTableView.Source = source;

            bool areThereEnoughWorkspaces(ICollection <SelectOption <IThreadSafeWorkspace> > workspaces) => workspaces.Count > 1;

            bool isWorkspaceNameTooLong(string workspaceName)
            {
                var attributes = new UIStringAttributes {
                    Font = WorkspaceLabel.Font
                };
                var size     = new NSString(workspaceName).GetSizeUsingAttributes(attributes);
                var maxWidth = TraitCollection.HorizontalSizeClass == UIUserInterfaceSizeClass.Regular
                    ? maximumWorkspaceNameLabelWidthRegular
                    : maximumWorkspaceNameLabelWidthCompact;

                return(size.Width >= maxWidth);
            };

            //Text
            ViewModel.WorkspaceNameObservable
            .Subscribe(WorkspaceLabel.Rx().Text())
            .DisposedBy(DisposeBag);

            ViewModel.CurrentDateRange
            .Subscribe(titleButton.Rx().Title())
            .DisposedBy(DisposeBag);

            //Visibility
            ViewModel.WorkspacesObservable
            .Select(areThereEnoughWorkspaces)
            .Subscribe(WorkspaceButton.Rx().IsVisible())
            .DisposedBy(DisposeBag);

            ViewModel.WorkspaceNameObservable
            .Select(isWorkspaceNameTooLong)
            .Subscribe(WorkspaceFadeView.Rx().FadeRight())
            .DisposedBy(DisposeBag);

            //Commands
            titleButton.Rx().Tap()
            .Subscribe(toggleCalendar)
            .DisposedBy(DisposeBag);

            ReportsTableView.Rx().Tap()
            .Subscribe(HideCalendar)
            .DisposedBy(DisposeBag);

            WorkspaceButton.Rx()
            .BindAction(ViewModel.SelectWorkspace)
            .DisposedBy(DisposeBag);

            void toggleCalendar()
            {
                if (calendarIsVisible)
                {
                    HideCalendar();
                    return;
                }

                if (TraitCollection.HorizontalSizeClass == UIUserInterfaceSizeClass.Compact)
                {
                    ShowCalendar();
                    return;
                }

                ShowPopoverCalendar();
            }
        }
Пример #8
0
        public override void TraitCollectionDidChange(UITraitCollection previousTraitCollection)
        {
            base.TraitCollectionDidChange(previousTraitCollection);

            ReportsTableView.ReloadData();
        }
Пример #9
0
        public void ScrollToTop()
        {
            var point = new CGPoint(0, -ReportsTableView.ContentInset.Top);

            ReportsTableView.SetContentOffset(point, true);
        }
Пример #10
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            calendarSizeDisposable = CalendarContainer.AddObserver(boundsKey, NSKeyValueObservingOptions.New, onCalendarSizeChanged);

            source                  = new ReportsTableViewSource(ReportsTableView, ViewModel);
            source.OnScroll        += onReportsTableScrolled;
            ReportsTableView.Source = source;

            bool areThereEnoughWorkspaces(ICollection <(string ItemName, IThreadSafeWorkspace Item)> workspaces) => workspaces.Count > 1;

            bool isWorkspaceNameTooLong(string workspaceName)
            {
                var attributes = new UIStringAttributes {
                    Font = WorkspaceLabel.Font
                };
                var size = new NSString(workspaceName).GetSizeUsingAttributes(attributes);

                return(size.Width >= maximumWorkspaceNameLabelWidth);
            };

            //Text
            ViewModel.WorkspaceNameObservable
            .Subscribe(WorkspaceLabel.Rx().Text())
            .DisposedBy(DisposeBag);

            ViewModel.CurrentDateRangeStringObservable
            .Subscribe(titleButton.Rx().Title())
            .DisposedBy(DisposeBag);

            //Visibility
            ViewModel.WorkspacesObservable
            .Select(areThereEnoughWorkspaces)
            .Subscribe(WorkspaceButton.Rx().IsVisible())
            .DisposedBy(DisposeBag);

            ViewModel.WorkspaceNameObservable
            .Select(isWorkspaceNameTooLong)
            .Subscribe(WorkspaceFadeView.Rx().FadeRight())
            .DisposedBy(DisposeBag);

            //Commands
            titleButton.Rx().Tap()
            .Subscribe(ViewModel.ToggleCalendar)
            .DisposedBy(DisposeBag);

            ReportsTableView.Rx().Tap()
            .Subscribe(ViewModel.HideCalendar)
            .DisposedBy(DisposeBag);

            WorkspaceButton.Rx()
            .BindAction(ViewModel.SelectWorkspace)
            .DisposedBy(DisposeBag);

            ViewModel.SegmentsObservable
            .Subscribe(segments => source.ItemsSource = segments)
            .DisposedBy(DisposeBag);
        }
Пример #11
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var separator = NavigationController.NavigationBar.InsertSeparator();

            separator.BackgroundColor = ColorAssets.OpaqueSeparator;

            calendarViewController = ViewControllerLocator.GetViewController(ViewModel.CalendarViewModel) as ReportsCalendarViewController;
            prepareViews();

            OverviewContainerView.AddSubview(overview);
            overview.Frame = OverviewContainerView.Bounds;
            overview.Item  = ViewModel;
            BarChartsContainerView.AddSubview(barChart);
            barChart.Frame = BarChartsContainerView.Bounds;
            barChart.Item  = ViewModel;

            calendarSizeDisposable = CalendarContainer.AddObserver(boundsKey, NSKeyValueObservingOptions.New, onCalendarSizeChanged);

            source = new ReportsTableViewSource(ReportsTableView, ViewModel);
            source.SetItems(ImmutableList <ChartSegment> .Empty);
            ReportsTableView.ReloadData();

            ViewModel.SegmentsObservable
            .Subscribe(ReportsTableView.Rx().ReloadItems(source))
            .DisposedBy(DisposeBag);

            source.ScrolledWithHeaderOffset
            .Subscribe(onReportsTableScrolled)
            .DisposedBy(DisposeBag);

            ReportsTableView.Source = source;

            bool areThereEnoughWorkspaces(ICollection <SelectOption <IThreadSafeWorkspace> > workspaces) => workspaces.Count > 1;

            bool isWorkspaceNameTooLong(string workspaceName)
            {
                var attributes = new UIStringAttributes {
                    Font = WorkspaceLabel.Font
                };
                var size     = new NSString(workspaceName).GetSizeUsingAttributes(attributes);
                var maxWidth = TraitCollection.HorizontalSizeClass == UIUserInterfaceSizeClass.Regular
                    ? maximumWorkspaceNameLabelWidthRegular
                    : maximumWorkspaceNameLabelWidthCompact;

                return(size.Width >= maxWidth);
            };

            //Text
            ViewModel.WorkspaceNameObservable
            .Subscribe(WorkspaceLabel.Rx().Text())
            .DisposedBy(DisposeBag);

            ViewModel.CurrentDateRange
            .Subscribe(titleButton.Rx().TitleAdaptive())
            .DisposedBy(DisposeBag);

            ViewModel.CurrentDateRange
            .Select(range => range == null)
            .DistinctUntilChanged()
            .Subscribe(shouldCenter =>
            {
                if (shouldCenter)
                {
                    activityIndicator.Frame = activityIndicatorCenteredFrame;
                }
                else
                {
                    activityIndicator.Frame = activityIndicatorLeftAlignedFrame;
                }
            })
            .DisposedBy(DisposeBag);

            //Visibility
            ViewModel.WorkspacesObservable
            .Select(areThereEnoughWorkspaces)
            .Do(updateWorkspaceButtonInsets)
            .Subscribe(WorkspaceButton.Rx().IsVisible())
            .DisposedBy(DisposeBag);

            ViewModel.WorkspaceNameObservable
            .Select(isWorkspaceNameTooLong)
            .Subscribe(WorkspaceFadeView.Rx().FadeRight())
            .DisposedBy(DisposeBag);

            ViewModel.IsLoadingObservable
            .Subscribe(activityIndicator.Rx().IsAnimating())
            .DisposedBy(DisposeBag);

            //Commands
            titleButton.Rx().Tap()
            .Subscribe(toggleCalendar)
            .DisposedBy(DisposeBag);

            ReportsTableView.Rx().Tap()
            .Subscribe(HideCalendar)
            .DisposedBy(DisposeBag);

            WorkspaceButton.Rx()
            .BindAction(ViewModel.SelectWorkspace)
            .DisposedBy(DisposeBag);

            //Handoff
            viewDidAppearSubject.AsObservable()
            .CombineLatest(
                ViewModel.WorkspaceId,
                ViewModel.StartDate,
                ViewModel.EndDate,
                (_, workspaceId, start, end) => createUserActivity(workspaceId, start, end))
            .Subscribe(updateUserActivity);

            NSUserActivity createUserActivity(long workspaceId, DateTimeOffset start, DateTimeOffset end)
            {
                var userActivity = new NSUserActivity(Handoff.Action.Reports);

                userActivity.EligibleForHandoff = true;
                userActivity.WebPageUrl         = Handoff.Url.Reports(workspaceId, start, end);
                return(userActivity);
            }

            void updateUserActivity(NSUserActivity userActivity)
            {
                UserActivity = userActivity;
                UserActivity.BecomeCurrent();
            }

            void toggleCalendar()
            {
                if (calendarIsVisible)
                {
                    HideCalendar();
                    return;
                }

                if (TraitCollection.HorizontalSizeClass == UIUserInterfaceSizeClass.Compact)
                {
                    ShowCalendar();
                    return;
                }

                ShowPopoverCalendar();
            }
        }