Files
CodeContextGenerator/CodeContextGenerator/Models/FileItem.cs
2025-12-11 01:01:33 +05:00

103 lines
2.9 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.ObjectModel;
namespace CodeContextGenerator.Models;
public partial class FileItem : ObservableObject
{
[ObservableProperty]
private string name;
[ObservableProperty]
private string fullName;
[ObservableProperty]
private bool isDirectory;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(HasSelectedChildren))]
private bool? isSelected;
[ObservableProperty]
private FileItem parent;
public ObservableCollection<FileItem> Children { get; } = new ObservableCollection<FileItem>();
// Событие, вызываемое при изменении состояния выбора
public event EventHandler SelectionChanged;
public bool HasSelectedChildren => Children.Any(c => c.IsSelected == true || c.HasSelectedChildren);
partial void OnIsSelectedChanged(bool? oldValue, bool? newValue)
{
if (newValue.HasValue)
{
UpdateChildrenSelection(newValue.Value);
}
UpdateParentSelection();
NotifySelectionChanged();
}
private void UpdateChildrenSelection(bool value)
{
if (!IsDirectory) return;
foreach (var child in Children)
{
// Гарантируем вызов события для каждого ребенка
var oldValue = child.IsSelected;
child.IsSelected = value;
if (oldValue != child.IsSelected)
{
child.RaiseSelectionChanged();
}
}
}
private void UpdateParentSelection()
{
if (Parent == null) return;
var children = Parent.Children;
var allSelected = children.All(c => c.IsSelected == true);
var noneSelected = children.All(c => c.IsSelected == false);
var hasIndeterminate = children.Any(c => c.IsSelected == null);
bool? newParentState = hasIndeterminate ? null : (allSelected ? true : (noneSelected ? false : null));
/*bool? newParentState;
if (hasIndeterminate)
{
newParentState = null;
}
else if (allSelected)
{
newParentState = true;
}
else if (noneSelected)
{
newParentState = false;
}
else
{
newParentState = null;
}*/
if (Parent.IsSelected != newParentState)
{
Parent.IsSelected = newParentState;
Parent.RaiseSelectionChanged();
}
}
private void NotifySelectionChanged()
{
RaiseSelectionChanged();
}
// Публичный метод для гарантии вызова события
public void RaiseSelectionChanged()
{
// Вызываем событие для текущего элемента
SelectionChanged?.Invoke(this, EventArgs.Empty);
}
}