public void CreateUiForCustomEntities(IEnumerable <SavedEntity> savedEntities, Action onEnterCreateMode)
    {
        selectObjectsBtn = new List <TabButton>();
        createModeBtn.onClick.AddListener(() =>
        {
            onEnterCreateMode?.Invoke();
            OnLeaveTestMode();
        });

        foreach (var savedEntity in savedEntities)
        {
            var newSelectBtn = Instantiate(behaviourButtonUi, behaviourTab);
            newSelectBtn.onClick.AddListener(() =>
            {
                foreach (var button in selectObjectsBtn)
                {
                    button.ToggleHighlight(newSelectBtn == button);
                }

                selectedEntity = savedEntity;
            });

            newSelectBtn.ChangeName(savedEntity.inGameObject.SubObjectName);
            selectObjectsBtn.Add(newSelectBtn);
        }

        ToggleVisible(true);
    }
 public SavedEntityItemViewModel(SavedEntity savedEntity, ManageEntitiesViewModel manageEntitiesViewModel)
 {
     SavedEntity = savedEntity;
     _manageEntitiesViewModel = manageEntitiesViewModel;
     UpdateClickedCommand     = CommandHelper.CreateCommand(UpdateClicked);
     SettingsClickedCommand   = CommandHelper.CreateCommand(SettingsClicked);
 }
        public TimetablePage()
        {
            InitializeComponent();
            AppSettings settings = SettingsRepository.GetSettings();

            lastTimeLeftVisible                 = TimeLeft.IsVisible;
            Timetable.VerticalOptions           = LayoutOptions.FillAndExpand;
            Timetable.VisibleDatesChangedEvent += Timetable_VisibleDatesChangedEvent;
            string activeCultureCode = Cultures.SupportedCultures[0].TwoLetterISOLanguageName;

            if (Cultures.SupportedCultures.Any(c => c.TwoLetterISOLanguageName == CultureInfo.CurrentCulture.TwoLetterISOLanguageName))
            {
                activeCultureCode = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
            }
            Timetable.Locale = activeCultureCode;
            switch (settings.TimetableViewMode)
            {
            case TimetableViewMode.Day:
                Timetable.ScheduleView = ScheduleView.DayView;
                break;

            case TimetableViewMode.Week:
                Timetable.ScheduleView = ScheduleView.WeekView;
                break;

            case TimetableViewMode.Month:
                Timetable.ScheduleView = ScheduleView.MonthView;
                break;
            }

            MessagingCenter.Subscribe <Application, SavedEntity>(this, MessageTypes.SelectedEntityChanged, (sender, newSelectedEntity) =>
            {
                UpdateEvents(newSelectedEntity);
            });
            MessagingCenter.Subscribe <Application, SavedEntity>(this, MessageTypes.TimetableUpdated, (sender, entity) =>
            {
                SavedEntity selectedEntity = UniversityEntitiesRepository.GetSelected();
                if (selectedEntity == null || selectedEntity != entity)
                {
                    return;
                }
                UpdateEvents(selectedEntity);
            });
            MessagingCenter.Subscribe <Application, SavedEntity>(this, MessageTypes.LessonSettingsChanged, (sender, entity) =>
            {
                SavedEntity selectedEntity = UniversityEntitiesRepository.GetSelected();
                if (selectedEntity == null || selectedEntity != entity)
                {
                    return;
                }
                UpdateEvents(selectedEntity);
            });
        }
示例#4
0
    public async void SpawnEntityAsync(SavedEntity savedEntity, Vector3 spawnPoint)
    {
        var go = await savedEntity.inGameObject.InstantiateAsync(floor.transform).Task;

        go.transform.position = spawnPoint;

        foreach (var savedBehaviour in savedEntity.savedBehaviours)
        {
            var behaviour = go.AddComponent(savedBehaviour.behaviourType);
            JsonUtility.FromJsonOverwrite(savedBehaviour.behaviourData, behaviour);
        }
    }
    public void OnLeaveTestMode()
    {
        if (selectObjectsBtn != null)
        {
            foreach (var button in selectObjectsBtn)
            {
                Destroy(button.gameObject);
            }
        }

        createModeBtn.onClick.RemoveAllListeners();
        ToggleVisible(false);
        selectedEntity = null;
    }
        public static async Task <IReadOnlyList <Entity> > CheckCistTimetableUpdateRights(params Entity[] entitiesToUpdate)
        {
            List <Entity> allowedEntities = new();

            entitiesToUpdate ??= Array.Empty <Entity>();

            List <SavedEntity> savedEntities = await UniversityEntitiesRepository.GetSaved();

            foreach (var entity in entitiesToUpdate)
            {
                SavedEntity savedEntity = savedEntities.SingleOrDefault(e => e == entity);
                if (savedEntity == null)
                {
                    // Cannot update timetable for entity that is not saved
                    continue;
                }

                DateTime nowInUkraine = TimeZoneInfo.ConvertTime(DateTime.Now, Config.UkraineTimezone);
                if (savedEntity.LastUpdated == null ||
                    (nowInUkraine.TimeOfDay >= Config.CistDailyTimetableUpdateStartTime && nowInUkraine.TimeOfDay < Config.CistDailyTimetableUpdateEndTime))
                {
                    // Update allowed if never updated before
                    // Unlimited updates between 5 and 6 AM
                    allowedEntities.Add(savedEntity);
                    continue;
                }

                // Update is allowd once per day (day begins at 6 AM)
                DateTime lastUpdatedInUkraine = TimeZoneInfo.ConvertTime(savedEntity.LastUpdated.Value, Config.UkraineTimezone);
                TimeSpan timeBeforeAnotherUpdate;
                if (lastUpdatedInUkraine.TimeOfDay < Config.CistDailyTimetableUpdateEndTime)
                {
                    timeBeforeAnotherUpdate = Config.CistDailyTimetableUpdateEndTime - lastUpdatedInUkraine.TimeOfDay;
                }
                else
                {
                    timeBeforeAnotherUpdate = TimeSpan.FromDays(1) - lastUpdatedInUkraine.TimeOfDay + Config.CistDailyTimetableUpdateEndTime;
                }
                if (nowInUkraine - lastUpdatedInUkraine > timeBeforeAnotherUpdate)
                {
                    allowedEntities.Add(savedEntity);
                    continue;
                }

#if UNLIMITED_UPDATES
                allowedEntities.Add(savedEntity);
#endif
            }
            return(allowedEntities);
        }
        public static List <SavedEntity> CheckCistTimetableUpdateRights(params SavedEntity[] entitiesToUpdate)
        {
            var allowedEntities = new List <SavedEntity>();

            if (entitiesToUpdate == null)
            {
                return(allowedEntities);
            }

            List <SavedEntity> savedEntities = UniversityEntitiesRepository.GetSaved();

            foreach (SavedEntity entity in entitiesToUpdate)
            {
                SavedEntity savedEntity = savedEntities.FirstOrDefault(g => g.ID == entity.ID);
                if (savedEntity == null)
                {
                    // Cannot update timetable for entity that is not saved
                    continue;
                }

                if (savedEntity.LastUpdated == null || (DateTime.Now.TimeOfDay.Hours >= 5 && DateTime.Now.TimeOfDay.Hours < 7))
                {
                    // Update allowed if never updated before
                    // Unlimited updates between 5 and 7 AM
                    allowedEntities.Add(savedEntity);
                    continue;
                }

                TimeSpan timeBeforeAnotherUpdate;
                if (savedEntity.LastUpdated.Value.TimeOfDay < Config.CistDailyTimetableUpdateTime)
                {
                    timeBeforeAnotherUpdate = Config.CistDailyTimetableUpdateTime - savedEntity.LastUpdated.Value.TimeOfDay;
                }
                else
                {
                    timeBeforeAnotherUpdate = TimeSpan.FromDays(1) - savedEntity.LastUpdated.Value.TimeOfDay + Config.CistDailyTimetableUpdateTime;
                }
                if (DateTime.Now - savedEntity.LastUpdated.Value > timeBeforeAnotherUpdate)
                {
                    allowedEntities.Add(savedEntity);
                    continue;
                }
#if DEBUG
                allowedEntities.Add(savedEntity);
#endif
            }
            return(allowedEntities);
        }
示例#8
0
    public void SaveCustomizedEntity()
    {
        if (chosenInGameObject == null)
        {
            Debug.LogError("can't save due to no in game object chosen");
            return;
        }

        var savedEntityData = new SavedEntity
        {
            inGameObject = chosenInGameObject, savedBehaviours = new List <SavedBehaviour>()
        };

        foreach (var addedBehaviour in userCustomDataByBehaviours.Keys)
        {
            var jsonData = userCustomDataByBehaviours[addedBehaviour];
            if (jsonData.attachToEntity)
            {
                savedEntityData.savedBehaviours.Add(new SavedBehaviour
                {
                    behaviourType = addedBehaviour, behaviourData = jsonData.jObject.ToString()
                });
            }
        }

        var serializedEntity = JsonUtility.ToJson(savedEntityData);

        if (deserializedData != null && deserializedData.Contains(serializedEntity))
        {
            Debug.LogError("an identical entity has been saved before. abort");
            return;
        }

        savedEntities.savedEntitiesList.Add(savedEntityData);
        var serializedData = JsonUtility.ToJson(savedEntities);

        File.WriteAllText(saveEntitiesPath, serializedData);
        deserializedData = serializedData;

        Debug.Log("Entity Saved");
    }
        public ManageLessonsPage(SavedEntity savedEntity)
        {
            InitializeComponent();
            Title += $": {savedEntity.Name}";

            timetable = EventsRepository.GetTimetableLocal(savedEntity);
            if (timetable == null)
            {
                return;
            }
            List <LessonInfo> lessonInfo = timetable.LessonsInfo;

            lessons = new ObservableCollection <LessonInfo>
                      (
                timetable.Lessons()
                .Select(lesson => lessonInfo.FirstOrDefault(li => li.Lesson == lesson) ?? new LessonInfo {
                Lesson = lesson
            })
                .OrderBy(lesson => !timetable.Events.Where(e => e.Start >= DateTime.Now).Any(e => e.Lesson == lesson.Lesson))
                .ThenBy(lesson => lesson.Lesson.ShortName)
                      );
            LessonsList.ItemsSource = lessons;
            if (lessons.Count == 0)
            {
                NoSourceLayout.IsVisible = true;
            }

            MessagingCenter.Subscribe <LessonSettingsPage, LessonInfo>(this, "OneLessonSettingsChanged", (sender, newLessonSettings) =>
            {
                for (int i = 0; i < lessons.Count; i++)
                {
                    if (lessons[i].Lesson == newLessonSettings.Lesson)
                    {
                        lessons[i] = newLessonSettings;
                        lessons[i].Settings.NotifyChanged();
                        break;
                    }
                }
            });
        }
        private void UpdateEvents(SavedEntity selectedEntity)
        {
            if (selectedEntity == null)
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    Title = LN.AppName;
                });
                TimetableLayout.IsVisible = false;
                NoSourceLayout.IsVisible  = true;
                return;
            }
            else
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    Title = selectedEntity.Name;
                });
                NoSourceLayout.IsVisible  = false;
                TimetableLayout.IsVisible = true;
            }

            lock (enumeratingEvents)
            {
                timetableInfo = EventsRepository.GetEvents(selectedEntity) ?? new TimetableInfo();
                if (ApplyHiddingSettings)
                {
                    timetableInfo.ApplyLessonSettings();
                }
            }

            Device.BeginInvokeOnMainThread(() =>
            {
                if (timetableInfo.Count == 0)
                {
                    Timetable.DataSource = null;
                }
                else
                {
                    int retriesLeft     = 25;
                    Exception exception = null;
                    do
                    {
                        try
                        {
                            lock (enumeratingEvents)
                            {
                                Timetable.MinDisplayDate = timetableInfo.StartDate();
                                Timetable.MaxDisplayDate = timetableInfo.EndDate();

                                Timetable.WeekViewSettings.StartHour = 0;
                                Timetable.WeekViewSettings.EndHour   = 24;
                                Timetable.WeekViewSettings.StartHour = timetableInfo.StartTime().TotalHours;
                                Timetable.WeekViewSettings.EndHour   = timetableInfo.EndTime().TotalHours + (Timetable.TimeInterval / 60 / 2);

                                Timetable.DayViewSettings.StartHour = 0;
                                Timetable.DayViewSettings.EndHour   = 24;
                                Timetable.DayViewSettings.StartHour = timetableInfo.StartTime().TotalHours;
                                Timetable.DayViewSettings.EndHour   = timetableInfo.EndTime().TotalHours + (Timetable.TimeInterval / 60 / 2);
                            }

                            UpdateTimetableHeight();

                            // Fix for bug when view header isn`t updating on first swipe
                            try
                            {
                                Timetable.VisibleDatesChangedEvent -= Timetable_VisibleDatesChangedEvent;

                                DateTime currebtDate = visibleDates.Count > 0 ? visibleDates[0] : DateTime.Now;
                                Timetable.NavigateTo(currebtDate.AddDays(7));
                                Timetable.NavigateTo(currebtDate);
                            }
                            catch { }
                            finally
                            {
                                Timetable.VisibleDatesChangedEvent += Timetable_VisibleDatesChangedEvent;
                            }

                            Timetable.DataSource = timetableInfo.Events.Select(ev => new EventViewModel(ev)).ToList();

                            UpdateTimeLeft();
                            break;
                        }
                        catch (Exception ex)
                        {
                            // Potential error with the SfSchedule control. Needs investigation!
                            exception = ex;
                        }

                        retriesLeft--;
                    } while (retriesLeft > 0);
                    if (retriesLeft == 0 && exception != null)
                    {
                        MessagingCenter.Send(Application.Current, MessageTypes.ExceptionOccurred, exception);

                        DisplayAlert(LN.TimetableDisplay, LN.TimetableDisplayError, LN.Ok);
                        return;
                    }
                }
            });
        }
示例#11
0
 protected virtual void OnSavedEntity(TEntity entity)
 {
     SavedEntity?.Invoke(this, new ComponentEventArgs <TEntity>(entity));
 }
示例#12
0
 public static void OnSavedEntity(SavedEntityEventArgs args)
 {
     SavedEntity?.Invoke(null, args);
 }
示例#13
0
 public static Entity Instantiate(SavedEntity e) => new Entity
 {
     Pos  = e.Pos,
     Age  = e.Age,
     Type = Definitions.EntityTypes.First(t => t.Name == e.Type)
 };