using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using Pf2e.Scrapper.Processors.Attributes;
using Pf2e.Scrapper.Processors.Attributes.Enum;
using Pf2e.Scrapper.Processors.Collection;
using CheckBox = System.Windows.Controls.CheckBox;
namespace Pf2e.WPF.Start.Components;
///
/// Логика взаимодействия для ProcessorCollectionControl.xaml
///
internal partial class ProcessorCollectionControl : System.Windows.Controls.UserControl
{
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ProcessorCollection Collection
{
get => _collection;
set
{
_collection = value;
SetContent();
}
}
private ProcessorCollection _collection = null!;
public ProcessorCollectionControl()
{
InitializeComponent();
}
private Dictionary GroupCheckBoxes { get; } = [];
private Dictionary GroupLastStats { get; } = [];
private Dictionary ItemCheckBoxes { get; } = [];
private void SetContent()
{
RootPanel.Children.Clear();
foreach (ProcessorGroupEnum group in Enum.GetValues())
{
GroupCheckBoxes[group] = new()
{
Content = group.ToString(),
IsThreeState = true,
Style = (Style)Resources["HeaderCheckbox"]!,
};
GroupCheckBoxes[group].Click += GroupCheckBox_Click;
System.Windows.Controls.Border border = new()
{
Style = (Style)Resources["ElementBorder"]!,
};
System.Windows.Controls.WrapPanel wrapPanel = new()
{
Style = (Style)Resources["ElementPanelStyle"]!,
};
foreach (ProcessorRecord item in Collection.AllItems.Where(item => item.Group == group))
{
ItemCheckBoxes[item.Name] = new()
{
Content = item.Description,
ToolTip = item.Name,
IsChecked = item.Active,
Style = (Style)Resources["ElementCheckBox"]!,
};
ItemCheckBoxes[item.Name].Click += ItemCheckBox_Click;
wrapPanel.Children.Add(ItemCheckBoxes[item.Name]);
}
border.Child = wrapPanel;
RootPanel.Children.Add(GroupCheckBoxes[group]);
RootPanel.Children.Add(border);
}
UpdateContent();
}
private void UpdateContent()
{
GroupLastStats.Clear();
List checkedItems = [];
foreach ((string key, CheckBox? checkBox) in ItemCheckBoxes)
{
ProcessorRecord item = Collection[key];
bool isChecked = checkBox.IsChecked ?? false;
if (GroupLastStats.TryGetValue(item.Group, out bool? state))
{
/*
* | true | false | null
* | Checked | Unchecked | Indeterminate
* -------+---------+-----------+---------------
* true | true | null | null
* false | null | false | null
*/
GroupLastStats[item.Group] =
isChecked && state == true ? true
: !isChecked && state == false ? false
: null;
}
else
{
GroupLastStats[item.Group] = isChecked;
}
if (isChecked)
{
checkedItems.Add(key);
}
}
foreach ((ProcessorGroupEnum groupEnum, CheckBox? checkBox) in GroupCheckBoxes)
{
checkBox.IsChecked = GroupLastStats.GetValueOrDefault(groupEnum, null);
}
Collection.FilterProcessors(checkedItems);
}
private void GroupCheckBox_Click(object sender, RoutedEventArgs e)
{
CheckBox groupCheckBox = (CheckBox)sender;
ProcessorGroupEnum groupEnum = GroupCheckBoxes
.First(pair => pair.Value == groupCheckBox)
.Key;
groupCheckBox.IsChecked =
GroupLastStats[groupEnum] is null || groupCheckBox.IsChecked is not null;
foreach (
(string _, CheckBox checkBox) in ItemCheckBoxes.Where(pair =>
Collection[pair.Key].Group == groupEnum
)
)
{
checkBox.IsChecked = groupCheckBox.IsChecked;
}
UpdateContent();
}
private void ItemCheckBox_Click(object sender, RoutedEventArgs e)
{
UpdateContent();
}
}