private void RenderDate(DateTime date) { int col = getColumn(date.DayOfWeek); grid.ColumnDefinitions[col].Width = (GridLength)Resources["ColumnGridLength"]; GridDaysHeader.ColumnDefinitions[col].Width = (GridLength)Resources["ColumnGridLength"]; AllDayItemsGrid.ColumnDefinitions[col].Width = (GridLength)Resources["ColumnGridLength"]; // Clear current items (skip first since that's the rectangle background) var toRemove = ChildrenInColumn(col).ToArray(); foreach (var remove in toRemove) { grid.Children.Remove(remove); } // Get arranger for the date var arranger = ViewModel.Items[date.DayOfWeek]; // Assign all day items (minus 1 since the column includes the first column for times) GetAllDayItemsControls().ElementAt(col - 1).ItemsSource = arranger.HolidayAndAllDayItems; foreach (var s in arranger.ScheduleItems) { MyScheduleItem visual = new MyScheduleItem() { Schedule = s.Item, Height = s.Height }; visual.Tapped += ScheduleItem_Tapped; visual.PointerEntered += ScheduleItem_PointerEntered; visual.PointerExited += ScheduleItem_PointerExited; AddVisualItem(visual, s, arranger.Date.DayOfWeek); } // Reverse the order so that when items expand, they appear on top of the items beneath them. // Otherwise I would have to do some crazy Z-order logic. foreach (var e in arranger.EventItems.Reverse()) { FrameworkElement visual; if (e.IsCollapsedMode) { visual = new MyCollapsedEventItem() { Item = e }; } else { visual = new MyFullEventItem { Item = e }; } AddVisualItem(visual, e, arranger.Date.DayOfWeek); } if (!ChildrenInColumn(col).Any() && (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) && !arranger.HolidayAndAllDayItems.Any()) { grid.ColumnDefinitions[col].Width = new GridLength(0); GridDaysHeader.ColumnDefinitions[col].Width = new GridLength(0); AllDayItemsGrid.ColumnDefinitions[col].Width = new GridLength(0); } if (arranger.IsDifferentSemester) { var diffSemesterOverlay = new DifferentSemesterOverlayControl(); Grid.SetColumn(diffSemesterOverlay, col); Grid.SetRowSpan(diffSemesterOverlay, int.MaxValue); diffSemesterOverlay.VerticalAlignment = VerticalAlignment.Top; diffSemesterOverlay.Height = 300; grid.Children.Add(diffSemesterOverlay); } if (arranger.HasHolidays) { // Dim children foreach (var child in ChildrenInColumn(col)) { child.Opacity = 0.7; } var holidayOverlay = new Rectangle() { Fill = new SolidColorBrush(Color.FromArgb(80, 228, 0, 137)) }; Grid.SetColumn(holidayOverlay, col); Grid.SetRowSpan(holidayOverlay, int.MaxValue); grid.Children.Add(holidayOverlay); } UpdateTimePaddingBasedOnAllDayItems(); }
private void render() { if (_holidaysLayout == null) { _holidaysLayout = new LinearLayout(Context) { Orientation = Orientation.Vertical }; _holidaysItemsWrapper = new ItemsControlWrapper(_holidaysLayout) { ItemTemplate = new CustomDataTemplate <ViewItemHoliday>(CreateHolidayView) }; base.AddView(_holidaysLayout); } if (_schedulesContent == null) { _schedulesContent = new RelativeLayout(Context); base.AddView(_schedulesContent); } else { _schedulesContent.RemoveAllViews(); } if (Classes == null || Date == DateTime.MinValue || !ViewModel.Semester.IsDateDuringThisSemester(Date)) { base.Visibility = ViewStates.Gone; return; } if (!_arrangedItems.IsValid()) { base.Visibility = ViewStates.Gone; return; } base.Visibility = ViewStates.Visible; //put in the vertical gap divider View verticalGap = new View(Context) { LayoutParameters = new RelativeLayout.LayoutParams( GapSize, RelativeLayout.LayoutParams.MatchParent) { LeftMargin = TimeIndicatorSize + GapSize } }; verticalGap.SetBackgroundResource(Resource.Color.scheduleSnapshotDividers); _schedulesContent.AddView(verticalGap); int row = 0; for (TimeSpan time = _arrangedItems.StartTime; time <= _arrangedItems.EndTime; time = time.Add(TimeSpan.FromHours(1)), row++) { int startHeight = row * HeightOfHour; _schedulesContent.AddView(new TextView(Context) { Text = Android.Text.Format.DateFormat.Is24HourFormat(Context) ? time.Hours.ToString() : new DateTime().Add(time).ToString("h ").TrimEnd(), TextSize = 26, LayoutParameters = new RelativeLayout.LayoutParams( TimeIndicatorSize, TimeIndicatorSize) { TopMargin = startHeight }, Gravity = GravityFlags.Center }); //if not last row, add the divider if (time + TimeSpan.FromHours(1) <= _arrangedItems.EndTime) { var v = new View(Context) { Background = new ColorDrawable(Color.White), LayoutParameters = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MatchParent, GapSize) { TopMargin = startHeight + TimeIndicatorSize } }; v.SetBackgroundResource(Resource.Color.scheduleSnapshotDividers); _schedulesContent.AddView(v); } } // Render the schedules foreach (var s in _arrangedItems.ScheduleItems) { MyScheduleItem visual = new MyScheduleItem(Context, s.Item); visual.Click += TimeItem_Click; AddVisualItem(visual, s); } // Reverse the order so that when items expand, they appear on top of the items beneath them. // Otherwise I would have to do some crazy Z-order logic. foreach (var e in _arrangedItems.EventItems.Reverse()) { View visual; if (e.IsCollapsedMode) { visual = new MyCollapsedEventItem(Context) { Item = e }; } else { visual = new MyFullEventItem(Context) { Item = e }; } AddVisualItem(visual, e); } }