using System.Collections.ObjectModel; using NotesDataAnalyst.NoteContent; namespace NotesDataAnalyst { // MainPage.xaml.cs public partial class MainPage : ContentPage { public DateTime DateCreated { get; set; } = DateTime.UtcNow; public ObservableCollection Notes { get; set; } public ObservableCollection FilteredNotes { get; set; } public MainPage() { InitializeComponent(); BindingContext = this; // Подписываемся на сообщения для обновления списка заметок MessagingCenter.Subscribe(this, "NoteSaved", (sender, savedNote) => { var existingNote = Notes.FirstOrDefault(n => n.Id == savedNote.Id); if (existingNote != null) { var index = Notes.IndexOf(existingNote); Notes.Remove(existingNote); Notes.Insert(0, savedNote); } else { // Вставляем новую заметку в начало списка Notes.Insert(0, savedNote); } ApplyCategoryFilter(); }); MessagingCenter.Subscribe(this, "NoteDeleted", (sender, deletedNote) => { Notes.Remove(deletedNote); ApplyCategoryFilter(); }); // Загружаем заметки из базы данных Notes = App.Database.GetAllNotes(); // Инициализация и загрузка данных CategoryManager.LoadCategories(); categoryPicker.ItemsSource = CategoryManager.Categories; categoryPicker.SelectedItem = CategoryManager.ActiveCategory ?? CategoryManager.Categories.FirstOrDefault(); // Notes = new ObservableCollection(); FilteredNotes = new ObservableCollection(); BindingContext = this; } protected override async void OnAppearing() { base.OnAppearing(); // Загружаем отсортированные заметки Notes = new ObservableCollection(App.Database.GetAllNotes().OrderByDescending(n => n.DateCreated)); // Применяем фильтрацию ApplyCategoryFilter(); // Обновляем выбранную категорию в Picker categoryPicker.SelectedItem = CategoryManager.ActiveCategory; } /* private void OnCollectionViewScrolled(object sender, ItemsViewScrolledEventArgs e) { // Получаем центр экрана по оси Y double centerScreenY = notesCollectionView.Height / 2; // Высота элемента (подберите в зависимости от реальной высоты элементов в CollectionView) double itemHeight = 150; // Итерируем видимые элементы по их индексам for (int i = e.FirstVisibleItemIndex; i <= e.LastVisibleItemIndex; i++) { // Находим элемент с индексом i var note = Notes[i]; // предполагаем, что Notes - ObservableCollection // Получаем фрейм элемента через шаблон var item = notesCollectionView.ItemTemplate.CreateContent() as Frame; if (item == null) continue; // Устанавливаем BindingContext для анимации текущего элемента item.BindingContext = note; // Позиция центра элемента double itemCenterY = (i * itemHeight) + (itemHeight / 2); // Расчёт расстояния до центра экрана double distanceFromCenter = Math.Abs(centerScreenY - itemCenterY); // Настройка масштаба и прозрачности double scale = Math.Max(0.75, 1 - (distanceFromCenter / centerScreenY)); double opacity = Math.Max(0.5, 1 - (distanceFromCenter / centerScreenY)); // Анимации: масштабирование и изменение прозрачности item.ScaleTo(scale, 250, Easing.CubicInOut); item.FadeTo(opacity, 250, Easing.CubicInOut); } }*/ private async void OnNoteTapped(object sender, EventArgs e) { // Получаем контекст заметки, на которую был выполнен клик var frame = sender as Frame; var selectedNote = frame?.BindingContext as Note; if (selectedNote != null) { // Переход на страницу NoteDetailPage с выбранной заметкой await Navigation.PushAsync(new NoteDetailPage(selectedNote)); } } // Обработчик для изменения текста в панели поиска private void OnSearchTextChanged(object sender, TextChangedEventArgs e) { ApplySearchFilter(e.NewTextValue); } private void ApplySearchFilter(string searchText) { FilteredNotes.Clear(); var filteredNotes = Notes .Where(note => string.IsNullOrEmpty(searchText) || (note.Title?.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0)) .ToList(); foreach (var note in filteredNotes) { FilteredNotes.Add(note); } } private ObservableCollection LoadNotes() { // Здесь загружаем заметки из базы данных или локального хранилища return new ObservableCollection(); } // Обработчик для изменения выбранной категории private void OnCategorySelected(object sender, EventArgs e) { // Проверяем, что categoryPicker.SelectedItem не является null if (categoryPicker.SelectedItem == null) return; string selectedCategory = categoryPicker.SelectedItem as string; // Устанавливаем активную категорию CategoryManager.ActiveCategory = selectedCategory; // Проверяем, что Notes и selectedCategory не null перед фильтрацией if (Notes == null || selectedCategory == null) { FilteredNotes = new ObservableCollection(Notes ?? new ObservableCollection()); } else if (selectedCategory == "Все категории") { FilteredNotes = new ObservableCollection(Notes); } else { FilteredNotes = new ObservableCollection(Notes.Where(note => note.Category == selectedCategory)); } // Обновляем привязку данных CollectionView notesCollectionView.ItemsSource = FilteredNotes; } protected override void OnDisappearing() { base.OnDisappearing(); // Отписываемся от сообщения при закрытии страницы MessagingCenter.Unsubscribe(this, "NoteDeleted"); } private async void OnNoteSelected(object sender, SelectionChangedEventArgs e) { if (e.CurrentSelection.FirstOrDefault() is Note selectedNote) { // Переход на NoteDetailPage вместо EditorPage await Navigation.PushAsync(new NoteDetailPage(selectedNote)); } ((CollectionView)sender).SelectedItem = null; } /* protected override async void OnAppearing() { base.OnAppearing(); // Загружаем заметки асинхронно // Notes = await LoadNotesAsync(); // Применяем фильтрацию на основе `ActiveCategory` ApplyCategoryFilter(); // Обновляем `Picker` с категориями categoryPicker.SelectedItem = CategoryManager.ActiveCategory; }*/ private void ApplyCategoryFilter() { if (CategoryManager.ActiveCategory == "Все категории" || string.IsNullOrEmpty(CategoryManager.ActiveCategory)) { FilteredNotes = new ObservableCollection(Notes); } else { // Фильтрация по категории FilteredNotes = new ObservableCollection(Notes.Where(note => note.Category == CategoryManager.ActiveCategory)); } // Обновляем привязку данных для CollectionView notesCollectionView.ItemsSource = FilteredNotes; } private async void AddNoteButton_Clicked(object sender, EventArgs e) { // Создаём новую пустую заметку var newNote = new Note(); // Переход на EditorPage с новой заметкой await Navigation.PushAsync(new EditorPage()); } } }