247 lines
9.7 KiB
C#
247 lines
9.7 KiB
C#
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());
|
||
}
|
||
|
||
}
|
||
|
||
}
|