NoteMAUI/NoteContent/MainPage.xaml.cs

247 lines
9.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<Note> Notes { get; set; }
public ObservableCollection<Note> FilteredNotes { get; set; }
public MainPage()
{
InitializeComponent();
BindingContext = this;
// Подписываемся на сообщения для обновления списка заметок
MessagingCenter.Subscribe<EditorPage, Note>(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<NoteDetailPage, Note>(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<Note>();
FilteredNotes = new ObservableCollection<Note>();
BindingContext = this;
}
protected override async void OnAppearing()
{
base.OnAppearing();
// Загружаем отсортированные заметки
Notes = new ObservableCollection<Note>(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<Note>
// Получаем фрейм элемента через шаблон
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<Note> LoadNotes()
{
// Здесь загружаем заметки из базы данных или локального хранилища
return new ObservableCollection<Note>();
}
// Обработчик для изменения выбранной категории
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<Note>(Notes ?? new ObservableCollection<Note>());
}
else if (selectedCategory == "Все категории")
{
FilteredNotes = new ObservableCollection<Note>(Notes);
}
else
{
FilteredNotes = new ObservableCollection<Note>(Notes.Where(note => note.Category == selectedCategory));
}
// Обновляем привязку данных CollectionView
notesCollectionView.ItemsSource = FilteredNotes;
}
protected override void OnDisappearing()
{
base.OnDisappearing();
// Отписываемся от сообщения при закрытии страницы
MessagingCenter.Unsubscribe<NoteDetailPage, Note>(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<Note>(Notes);
}
else
{
// Фильтрация по категории
FilteredNotes = new ObservableCollection<Note>(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());
}
}
}