public static CalendarViewItemsGroup Load(Guid localAccountId, ViewItemSemester semester)
        {
            var answer = new CalendarViewItemsGroup(localAccountId, semester);

            // There's actually nothing to load async here, since classes/schedules are already loaded
            return(answer);
        }
 public void SetSemester(ViewItemSemester semester)
 {
     foreach (var view in GetViews().OfType <MyMonthView>())
     {
         view.SetSemester(semester);
     }
 }
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            ViewItemSemester semester = value as ViewItemSemester;

            if (semester == null)
            {
                return(value);
            }

            // If neither are assigned, do nothing
            if (PowerPlannerSending.DateValues.IsUnassigned(semester.Start) && PowerPlannerSending.DateValues.IsUnassigned(semester.End))
            {
                return("");
            }

            string start = "";

            if (!PowerPlannerSending.DateValues.IsUnassigned(semester.Start))
            {
                start = semester.Start.ToString("d");
            }

            string end = "";

            if (!PowerPlannerSending.DateValues.IsUnassigned(semester.End))
            {
                end = semester.End.ToString("d");
            }

            return(start + " - \n" + end);
        }
        private static SemesterItemsViewGroup CreateInstance(Guid localAccountId, ViewItemSemester semester, bool trackChanges = true)
        {
            var answer = new SemesterItemsViewGroup(localAccountId, semester, trackChanges);

            answer.LoadingTask = Task.Run(answer.LoadBlocking);
            return(answer);
        }
示例#5
0
        private void YearView_OnRequestOpenSemester(object sender, ViewItemSemester e)
        {
            ViewModel.OpenSemester(e.Identifier);

            // Just for iOS, we remove the popup, it doesn't play happy with all popups being cleared
            ViewModel.RemoveViewModel();
        }
示例#6
0
        public static string Convert(ViewItemSemester semester)
        {
            if (semester == null)
            {
                return("");
            }

            // If neither are assigned, do nothing
            if (PowerPlannerSending.DateValues.IsUnassigned(semester.Start) && PowerPlannerSending.DateValues.IsUnassigned(semester.End))
            {
                return("");
            }

            string start = "";

            if (!PowerPlannerSending.DateValues.IsUnassigned(semester.Start))
            {
                start = semester.Start.ToString("d");
            }

            string end = "";

            if (!PowerPlannerSending.DateValues.IsUnassigned(semester.End))
            {
                end = semester.End.ToString("d");
            }

            return(start + " - \n" + end);
        }
        private SemesterItemsViewGroup(Guid localAccountId, ViewItemSemester semester, bool trackChanges = true) : base(localAccountId, trackChanges)
        {
            if (semester == null)
            {
                throw new ArgumentNullException("semester");
            }

            Semester = semester;
        }
        private AgendaViewItemsGroup(Guid localAccountId, ViewItemSemester semester, DateTime today, bool trackChanges = true) : base(localAccountId, trackChanges)
        {
            if (semester == null)
            {
                throw new ArgumentNullException("semester");
            }

            _semester = semester;
            Today     = today;
        }
        private void OpenSemester()
        {
            ViewItemSemester s = getSemester();

            if (s == null)
            {
                return;
            }

            OnRequestOpenSemester?.Invoke(this, s);
        }
        public ClassViewModel(BaseViewModel parent, Guid localAccountId, Guid classId, DateTime today, ViewItemSemester semester) : base(parent)
        {
            _localAccountId = localAccountId;
            ClassId         = classId;
            _today          = today;
            _semester       = semester;

            ListenToItem(classId).Deleted += Class_Deleted;

            ListenToLocalEditsFor <DataLayer.DataItems.DataItemMegaItem>().ChangedItems += ItemsLocallyEditedListener_ChangedItems;
        }
        private void ButtonName_Click(object sender, RoutedEventArgs e)
        {
            // This will edit the semester
            ViewItemSemester s = getSemester();

            if (s == null)
            {
                return;
            }

            OnRequestEditSemester?.Invoke(this, s);
        }
        private View CreateSemester(ViewGroup root, ViewItemSemester semester)
        {
            var view = new ListItemSemesterView(root)
            {
                DataContext = semester
            };

            view.OpenSemesterRequested += ListItemSemesterView_OpenSemesterRequested;
            view.EditSemesterRequested += ListItemSemesterView_EditSemesterRequested;

            return(view);
        }
示例#13
0
        private void Initialize(Guid localAccountId, ViewItemSemester semester)
        {
            var acct = MainScreenViewModel.CurrentAccount;

            if (acct == null)
            {
                throw new NullReferenceException("MainScreenViewModel.CurrentAccount was null");
            }
            _showPastCompleteItemsOnFullCalendar = acct.ShowPastCompleteItemsOnFullCalendar;
            FirstDayOfWeek = acct.WeekChangesOn;

            SemesterItemsViewGroup = SemesterItemsViewGroup.Load(localAccountId, semester);
        }
示例#14
0
        public CalendarViewModel(BaseViewModel parent, Guid localAccountId, ViewItemSemester semester) : base(parent)
        {
            // iOS uses this to show the day when day before notification is clicked
            if (_initialSelectedDate != DateTime.MinValue)
            {
                NavigationManager.SetSelectedDate(_initialSelectedDate);
                NavigationManager.SetDisplayMonth(_initialSelectedDate);
                _selectedDate        = NavigationManager.GetSelectedDate();
                _displayMonth        = NavigationManager.GetDisplayMonth();
                _initialSelectedDate = DateTime.MinValue;
            }

            Initialize(localAccountId, semester);
        }
        private async Task LoadBlocking()
        {
            var dataStore = await GetDataStore();

            DataItemClass[]          dataClasses;
            DataItemSchedule[]       dataSchedules;
            DataItemWeightCategory[] dataWeights = null; // Weights are now needed for adding tasks/events
            DataItemSemester         dataSemester;

            using (await Locks.LockDataForReadAsync("ScheduleViewItemsGroup.LoadBlocking"))
            {
                var timeTracker = TimeTracker.Start();
                dataSemester = dataStore.TableSemesters.FirstOrDefault(i => i.Identifier == SemesterId);

                if (dataSemester == null)
                {
                    throw new SemesterNotFoundException();
                }

                dataClasses = dataStore.TableClasses.Where(i => i.UpperIdentifier == SemesterId).ToArray();

                Guid[] classIdentifiers = dataClasses.Select(i => i.Identifier).ToArray();

                dataSchedules = dataStore.TableSchedules.Where(i => classIdentifiers.Contains(i.UpperIdentifier)).ToArray();

                if (_includeWeightCategories)
                {
                    dataWeights = dataStore.TableWeightCategories.Where(i => classIdentifiers.Contains(i.UpperIdentifier)).ToArray();
                }
                timeTracker.End(3, "ScheduleViewItemsGroup.LoadBlocking loading items from database");

                timeTracker = TimeTracker.Start();
                var semester = new ViewItemSemester(dataSemester, CreateClass);

                semester.FilterAndAddChildren(dataClasses);

                foreach (var c in semester.Classes)
                {
                    c.FilterAndAddChildren(dataSchedules);

                    if (_includeWeightCategories)
                    {
                        c.FilterAndAddChildren(dataWeights);
                    }
                }

                this.Semester = semester;
                timeTracker.End(3, "ScheduleViewItemsGroup.LoadBlocking constructing view items");
            }
        }
        protected override void OnDataChangedEvent(DataChangedEvent e)
        {
            ViewItemSemester s = Item?.Class?.Semester;

            if (s != null)
            {
                s.HandleDataChangedEvent(e);
                Item.HandleDataChangedEvent(e);

                // And update the class
                var newClass = s.Classes.FirstOrDefault(c => c.Identifier == (Item.DataItem as DataItemMegaItem).UpperIdentifier);
                Item.GetType().GetRuntimeProperty("Class").SetValue(Item, newClass);
            }
        }
示例#17
0
        public static Task <HolidayViewItemsGroup> LoadAsync(Guid localAccountId, ViewItemSemester semester, DateTime start, DateTime end, bool trackChanges = true)
        {
            if (semester == null)
            {
                throw new ArgumentNullException("semester");
            }

            if (trackChanges)
            {
                throw new NotImplementedException("Tracking changes currently isn't implemented");
            }

            start = start.Date;
            end   = end.Date;

            return(CreateLoadTask(localAccountId, semester, start, end, trackChanges));
        }
        public static SemesterItemsViewGroup Load(Guid localAccountId, ViewItemSemester semester, bool trackChanges = true)
        {
            if (trackChanges)
            {
                SemesterItemsViewGroup answer;
                lock (_cachedSemesterItems)
                {
                    if (_cachedSemesterItems.TryGetValue(semester.Identifier, out answer))
                    {
                        return(answer);
                    }

                    answer = CreateInstance(localAccountId, semester, true);
                    _cachedSemesterItems[semester.Identifier] = answer;
                    return(answer);
                }
            }

            // If not tracking changes, we'll load a fresh instance
            return(CreateInstance(localAccountId, semester, false));
        }
        public static AddSemesterViewModel CreateForEdit(BaseViewModel parent, ViewItemSemester semesterToEdit)
        {
            var viewModel = new AddSemesterViewModel(parent)
            {
                State          = OperationState.Editing,
                SemesterToEdit = semesterToEdit,
                Name           = semesterToEdit.Name
            };

            if (!PowerPlannerSending.DateValues.IsUnassigned(semesterToEdit.Start))
            {
                viewModel.StartDate = semesterToEdit.Start.Date;
            }

            if (!PowerPlannerSending.DateValues.IsUnassigned(semesterToEdit.End))
            {
                viewModel.EndDate = semesterToEdit.End.Date;
            }

            viewModel.ListenToItem(semesterToEdit.Identifier).Deleted += viewModel.Semester_Deleted;

            return(viewModel);
        }
        public static Task <AgendaViewItemsGroup> LoadAsync(Guid localAccountId, ViewItemSemester semester, DateTime today, bool trackChanges = true)
        {
            if (semester == null)
            {
                throw new ArgumentNullException("semester");
            }

            if (!trackChanges)
            {
                return(CreateLoadStandalone(localAccountId, semester, today));
            }

            Task <AgendaViewItemsGroup> answer;

            lock (_cache)
            {
                // We compare exactly on semester reference, since otherwise the children could end up with different class objects than parents.
                // We had a bug here where a semester from the widget was being used, which didn't load the weight categories, and previously we were
                // comparing by identifier, so it used the cached version which led to a crash.
                var matchingCache = _cache.FirstOrDefault(i =>
                                                          i.Semester == semester &&
                                                          i.Today == today &&
                                                          !i.Task.IsCanceled &&
                                                          !i.Task.IsFaulted);
                if (matchingCache != null)
                {
                    // Note that ideally we would perform a re-filter here to eliminate events that expired today.
                    // However, if we re-filtered from a background thread and a UI thread was listening to this collection,
                    // it would throw an exception. Hence we won't do that.
                    return(matchingCache.Task);
                }

                answer = CreateLoadTask(localAccountId, semester, today);
                _cache.Add(new CacheItem(semester, today, answer));
                return(answer);
            }
        }
示例#21
0
 private void YearView_OnEditSemesterRequested(object sender, ViewItemSemester e)
 {
     ViewModel.EditSemester(e);
 }
 public CacheItem(ViewItemSemester semester, DateTime today, Task <AgendaViewItemsGroup> task)
 {
     Semester = semester;
     Today    = today;
     Task     = task;
 }
示例#23
0
        /// <summary>
        /// Throws ArgumentException if class wasn't found
        /// </summary>
        /// <param name="localAccountId"></param>
        /// <param name="classId"></param>
        /// <returns></returns>
        public static async Task <ClassViewItemsGroup> LoadAsync(Guid localAccountId, Guid classId, DateTime today, ViewItemSemester viewItemSemester, bool includeWeights = true)
        {
            ClassViewItemsGroup answer = new ClassViewItemsGroup(localAccountId, classId, today);
            await answer.LoadAsync(viewItemSemester, includeWeights);

            return(answer);
        }
示例#24
0
 public void EditSemester(ViewItemSemester semester)
 {
     ShowPopup(AddSemesterViewModel.CreateForEdit(MainScreenViewModel, semester));
 }
 private void ListItemSemesterView_OpenSemesterRequested(object sender, ViewItemSemester e)
 {
     OnOpenSemesterRequested?.Invoke(this, e);
 }
示例#26
0
 private async Task LoadAsync(ViewItemSemester viewItemSemester, bool includeWeights)
 {
     await Task.Run(async delegate { await LoadBlocking(viewItemSemester, includeWeights); });
 }
示例#27
0
 public AgendaViewModel(BaseViewModel parent, Guid localAccountId, ViewItemSemester semester, DateTime today) : base(parent)
 {
     _semester = semester;
     Today     = today.Date;
 }
        ///// <summary>
        ///// Eliminates any items that have become expired (like events that have expired)
        ///// </summary>
        //private void Refilter()
        //{
        //    // Beware - can't do this from a background thread or else it would crash things
        //    // Hence we actually need to only do this from a UI thread and also ensure to put it in the
        //    // lock so that background threads using cached item don't get messed up
        //    Guid[] classIdentifiers = Classes.Select(i => i.Identifier).ToArray();
        //    DateTime todayAsUtc = DateTime.SpecifyKind(DateTime.Today, DateTimeKind.Utc);

        //    this.Items.RemoveWhere(i => !ShouldIncludeItem(i.DataItem as DataItemMegaItem, classIdentifiers, todayAsUtc);
        //}

        private static async Task <AgendaViewItemsGroup> CreateLoadTask(Guid localAccountId, ViewItemSemester semester, DateTime today)
        {
            var answer = new AgendaViewItemsGroup(localAccountId, semester, today, trackChanges: true);

            SemesterItemsViewGroup cached = SemesterItemsViewGroup.GetCached(semester.Identifier);

            if (cached != null)
            {
                // Can perform this without locks since we already know we're on UI thread right now,
                // and any modifications to the SemesterItems list would need to be on UI thread to occur
                await cached.LoadingTask;
                answer.PrepareFromCached(cached);
            }
            else
            {
                await Task.Run(answer.LoadBlocking);
            }
            return(answer);
        }
示例#29
0
 private void SemesterView_OnRequestOpenSemester(object sender, ViewItemSemester e)
 {
     OnRequestOpenSemester?.Invoke(this, e);
 }
        private static async Task <AgendaViewItemsGroup> CreateLoadStandalone(Guid localAccountId, ViewItemSemester semester, DateTime today)
        {
            var answer = new AgendaViewItemsGroup(localAccountId, semester, today, trackChanges: false);
            await Task.Run(answer.LoadBlocking);

            return(answer);
        }