public void WhenThreeItemsOverlapButOnlyTwoColumnsAreRequired()
        {
            var calendarItems = new[]
            {
                new CalendarItem("1", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 8, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(90), "Item 1",
                                 CalendarIconKind.None),
                new CalendarItem("2", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 9, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(90), "Item 2",
                                 CalendarIconKind.None),
                new CalendarItem("3", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 10, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(30), "Item 3",
                                 CalendarIconKind.None),
            };

            var timeService = Substitute.For <ITimeService>();
            var calculator  = new CalendarLayoutCalculator(timeService);

            var layoutAttributes = calculator.CalculateLayoutAttributes(calendarItems);

            layoutAttributes.Should().HaveSameCount(calendarItems)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[0].StartTime && attributes.TotalColumns == 2 && attributes.ColumnIndex == 0)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[1].StartTime && attributes.TotalColumns == 2 && attributes.ColumnIndex == 1)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[2].StartTime && attributes.TotalColumns == 2 && attributes.ColumnIndex == 0);
        }
        public void OverlapingCalendarEventsAreAlwaysToTheLeft()
        {
            var calendarItems = new[]
            {
                new CalendarItem("1", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 8, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(180), "Item 1",
                                 CalendarIconKind.None),
                new CalendarItem("2", CalendarItemSource.Calendar,
                                 new DateTimeOffset(2018, 11, 21, 9, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(180), "Item 2",
                                 CalendarIconKind.None),
                new CalendarItem("3", CalendarItemSource.Calendar,
                                 new DateTimeOffset(2018, 11, 21, 10, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(180), "Item 3",
                                 CalendarIconKind.None),
            };

            var timeService = Substitute.For <ITimeService>();
            var calculator  = new CalendarLayoutCalculator(timeService);

            var layoutAttributes = calculator.CalculateLayoutAttributes(calendarItems);

            layoutAttributes.Should().HaveSameCount(calendarItems)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[0].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 2)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[1].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 0)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[2].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 1);
        }
示例#3
0
        public CalendarAdapter(Context context, ITimeService timeService, int screenWidth)
        {
            var layoutCalculator = new CalendarLayoutCalculator(timeService);

            layoutAnchorsCalculator = new LayoutAnchorsCalculator(context, screenWidth, anchorCount, layoutCalculator);

            anchors = Enumerable.Range(0, 24).Select(_ => new Anchor(56.DpToPixels(context), new AnchorData[0])).ToList();

            firstTapSubject.Subscribe(onFirstTap)
            .DisposedBy(disposeBag);
        }
示例#4
0
        private void init()
        {
            timeService = AndroidDependencyContainer.Instance.TimeService;
            calendarLayoutCalculator = new CalendarLayoutCalculator(timeService);
            gestureDetector          = new GestureDetector(Context, new CalendarGestureListener(onTouchDown, scrollView, flingView, onSingleTapUp));
            scroller   = new OverScroller(Context);
            handler    = new Handler(Looper.MainLooper);
            hourHeight = 56.DpToPixels(Context);
            maxHeight  = hourHeight * 24;

            initBackgroundBackingFields();
            initEventDrawingBackingFields();
        }
示例#5
0
 public LayoutAnchorsCalculator(Context context, int screenWidth, int anchorCount, CalendarLayoutCalculator calendarLayoutCalculator)
 {
     this.screenWidth = screenWidth;
     this.anchorCount = anchorCount;
     this.calendarLayoutCalculator = calendarLayoutCalculator;
     hourHeight         = 56.DpToPixels(context);
     minHourHeight      = hourHeight / 4f;
     leftMargin         = 68.DpToPixels(context);
     leftPadding        = 4.DpToPixels(context);
     rightPadding       = 4.DpToPixels(context);
     itemSpacing        = 4.DpToPixels(context);
     availableWidth     = this.screenWidth - leftMargin;
     halfAvailableWidth = availableWidth / 2f;
 }
        public void CalendarEventsHaveTheirOwnColumnsToTheLeft()
        {
            var calendarItems = new[]
            {
                new CalendarItem("1", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 8, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(90), "Item 1",
                                 CalendarIconKind.None),
                new CalendarItem("2", CalendarItemSource.Calendar,
                                 new DateTimeOffset(2018, 11, 21, 9, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(60), "Item 2",
                                 CalendarIconKind.None),
                new CalendarItem("3", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 9, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(30), "Item 3",
                                 CalendarIconKind.None),
                new CalendarItem("4", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 11, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(120), "Item 4",
                                 CalendarIconKind.None),
                new CalendarItem("5", CalendarItemSource.Calendar,
                                 new DateTimeOffset(2018, 11, 21, 11, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(60), "Item 5",
                                 CalendarIconKind.None),
            };

            var timeService = Substitute.For <ITimeService>();
            var calculator  = new CalendarLayoutCalculator(timeService);

            var layoutAttributes = calculator.CalculateLayoutAttributes(calendarItems);

            layoutAttributes.Should().HaveSameCount(calendarItems)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[0].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 1)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[1].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 0)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[2].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 2)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[3].StartTime &&
                         attributes.TotalColumns == 2 &&
                         calendarItems[3].Duration == attributes.Duration &&
                         attributes.ColumnIndex == 1)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[4].StartTime &&
                         attributes.TotalColumns == 2 &&
                         calendarItems[4].Duration == attributes.Duration &&
                         attributes.ColumnIndex == 0);
        }
示例#7
0
        public CalendarCollectionViewSource(
            ITimeService timeService,
            UICollectionView collectionView,
            IObservable <TimeFormat> timeOfDayFormat,
            ObservableGroupedOrderedCollection <CalendarItem> collection)
        {
            Ensure.Argument.IsNotNull(timeService, nameof(timeService));
            Ensure.Argument.IsNotNull(timeOfDayFormat, nameof(timeOfDayFormat));
            Ensure.Argument.IsNotNull(collection, nameof(collection));
            this.timeService = timeService;
            this.timeOfDayFormatObservable = timeOfDayFormat;
            this.collection     = collection;
            this.collectionView = collectionView;

            layoutCalculator = new CalendarLayoutCalculator(timeService);
            calendarItems    = new List <CalendarItem>();
            layoutAttributes = new List <CalendarItemLayoutAttributes>();

            registerCells();

            timeOfDayFormat
            .Subscribe(timeOfDayFormatChanged)
            .DisposedBy(disposeBag);

            collection
            .CollectionChange
            .ObserveOn(IosDependencyContainer.Instance.SchedulerProvider.MainScheduler)
            .Subscribe(_ => onCollectionChanges())
            .DisposedBy(disposeBag);

            timeService
            .MidnightObservable
            .Subscribe(dateChanged)
            .DisposedBy(disposeBag);

            timeService
            .CurrentDateTimeObservable
            .DistinctUntilChanged(offset => offset.Minute)
            .ObserveOn(IosDependencyContainer.Instance.SchedulerProvider.MainScheduler)
            .Subscribe(_ => updateLayoutAttributesIfNeeded())
            .DisposedBy(disposeBag);

            onCollectionChanges();
        }
        public void WhenItemsOverlapInTwoDifferentGroupsWithDifferentNumberOfColumns()
        {
            var calendarItems = new[]
            {
                new CalendarItem("1", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 8, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(180), "Item 1",
                                 CalendarIconKind.None),
                new CalendarItem("2", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 9, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(90), "Item 2",
                                 CalendarIconKind.None),
                new CalendarItem("3", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 10, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(90), "Item 3",
                                 CalendarIconKind.None),
                new CalendarItem("4", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 14, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(90), "Item 4",
                                 CalendarIconKind.None),
                new CalendarItem("5", CalendarItemSource.TimeEntry,
                                 new DateTimeOffset(2018, 11, 21, 15, 0, 0, TimeSpan.Zero), TimeSpan.FromMinutes(90), "Item 5",
                                 CalendarIconKind.None),
            };

            var timeService = Substitute.For <ITimeService>();
            var calculator  = new CalendarLayoutCalculator(timeService);

            var layoutAttributes = calculator.CalculateLayoutAttributes(calendarItems);

            layoutAttributes.Should().HaveSameCount(calendarItems)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[0].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 0)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[1].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 1)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[2].StartTime && attributes.TotalColumns == 3 && attributes.ColumnIndex == 2)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[3].StartTime && attributes.TotalColumns == 2 && attributes.ColumnIndex == 0)
            .And.Contain((attributes) =>
                         attributes.StartTime == calendarItems[4].StartTime && attributes.TotalColumns == 2 && attributes.ColumnIndex == 1);
        }