using Elwig.Helpers; using Elwig.Models.Entities; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; namespace Elwig.Windows { public partial class BaseDataWindow { private Dictionary? _mods = null; private Dictionary? _modIds = null; private ObservableCollection? _modList = null; private bool _modChanged = false; private bool _modUpdate = false; private void ModifiersInitEditing() { SeasonList.IsEnabled = false; var year = (SeasonList.SelectedItem as Season)?.Year; _modList = new(Context.Modifiers.Where(m => m.Year == year).OrderBy(m => m.Ordering).ToList()); _mods = _modList.ToDictionary(m => m.ModId, m => (string?)m.ModId); _modIds = _modList.ToDictionary(m => m, m => m.ModId); ControlUtils.RenewItemsSource(SeasonModifierList, _modList, m => (m as Modifier)?.ModId); SeasonModifierList_SelectionChanged(null, null); } private void ModifiersFinishEditing() { var year = (SeasonList.SelectedItem as Season)?.Year; ControlUtils.RenewItemsSource(SeasonModifierList, Context.Modifiers.Where(m => m.Year == year).OrderBy(m => m.Ordering).ToList(), m => (m as Modifier)?.ModId); _modList = null; _mods = null; _modIds = null; _modChanged = false; SeasonModifierUpButton.IsEnabled = false; SeasonModifierDownButton.IsEnabled = false; SeasonModifierAddButton.IsEnabled = false; SeasonModifierDeleteButton.IsEnabled = false; SeasonList.IsEnabled = true; } private async Task ModifiersSave() { if (!_modChanged || _modList == null || _mods == null || _modIds == null) return; int i = 0; foreach (var mod in _modList) mod.Ordering = ++i; var year = (SeasonList.SelectedItem as Season)?.Year; foreach (var (modid, _) in _mods.Where(m => m.Value == null)) { Context.Remove(Context.Modifiers.Find(year, modid)); } foreach (var (mod, old) in _modIds) { mod.ModId = old; } foreach (var (old, modid) in _mods.Where(m => m.Value != null)) { Context.Update(Context.Modifiers.Find(year, old)); } await Context.SaveChangesAsync(); foreach (var (old, modid) in _mods.Where(m => m.Value != null)) { await Context.Database.ExecuteSqlAsync($"UPDATE modifier SET modid = {modid} WHERE (year, modid) = ({year}, {old})"); } await Context.SaveChangesAsync(); foreach (var mod in _modList.Where(m => !_modIds.ContainsKey(m))) { if (mod.ModId == null) continue; await Context.AddAsync(mod); } await Context.SaveChangesAsync(); } private void SeasonModifierUpButton_Click(object sender, RoutedEventArgs evt) { if (_modList == null) return; _modChanged = true; var idx = SeasonModifierList.SelectedIndex; var item = _modList[idx]; _modList.RemoveAt(idx); idx--; _modList.Insert(idx, item); SeasonModifierList.SelectedIndex = idx; UpdateButtons(); } private void SeasonModifierDownButton_Click(object sender, RoutedEventArgs evt) { if (_modList == null) return; _modChanged = true; var idx = SeasonModifierList.SelectedIndex; var item = _modList[idx]; _modList.RemoveAt(idx); idx++; _modList.Insert(idx, item); SeasonModifierList.SelectedIndex = idx; UpdateButtons(); } private void SeasonModifierAddButton_Click(object sender, RoutedEventArgs evt) { if (_modList == null || SeasonList.SelectedItem is not Season s) return; _modChanged = true; var idx = (SeasonModifierList.SelectedIndex != -1) ? SeasonModifierList.SelectedIndex + 1 : _modList.Count; var item = new Modifier { Year = s.Year }; _modList.Insert(idx, item); SeasonModifierList.SelectedIndex = idx; UpdateButtons(); } private void SeasonModifierDeleteButton_Click(object sender, RoutedEventArgs evt) { if (_modList == null || _mods == null) return; _modChanged = true; var idx = SeasonModifierList.SelectedIndex; var item = _modList[idx]; _mods[item.ModId] = null; _modList.RemoveAt(idx); SeasonModifierList.SelectedIndex = idx < _modList.Count ? idx : idx - 1; UpdateButtons(); } private void SeasonModifierList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) { UpdateButtons(); _modUpdate = true; if (SeasonModifierList.SelectedItem is not Modifier mod) { SeasonModifierIdInput.Text = ""; SeasonModifierNameInput.Text = ""; SeasonModifierRelInput.Text = ""; SeasonModifierAbsInput.Text = ""; } else { SeasonModifierIdInput.Text = mod.ModId; SeasonModifierNameInput.Text = mod.Name; SeasonModifierRelInput.Text = (mod.Rel * 100)?.ToString() ?? ""; SeasonModifierAbsInput.Text = mod.Abs?.ToString() ?? ""; } _modUpdate = false; } private void SeasonModifier_Changed(object? sender, RoutedEventArgs? evt) { if (_modUpdate || (!IsEditing && !IsCreating) || SeasonModifierList.SelectedItem is not Modifier mod || SeasonList.SelectedItem is not Season s || _mods == null || _modIds == null) return; _modChanged = true; var old = _modIds.GetValueOrDefault(mod); var id = SeasonModifierIdInput.Text ?? ""; if (old != null) _mods[old] = id; mod.ModId = id; mod.Name = SeasonModifierNameInput.Text; mod.Rel = decimal.TryParse(SeasonModifierRelInput.Text, out var vRel) ? vRel / 100 : null; mod.AbsValue = decimal.TryParse(SeasonModifierAbsInput.Text, out var vAbs) ? Utils.DecToDb(vAbs, s.Precision) : null; CollectionViewSource.GetDefaultView(_modList).Refresh(); UpdateButtons(); } private void SeasonModifierIdInput_TextChanged(object sender, TextChangedEventArgs evt) { UpperCaseInput_TextChanged(sender, evt); SeasonModifier_Changed(sender, evt); } private void SeasonModifierRelInput_TextChanged(object sender, TextChangedEventArgs evt) { InputTextChanged((TextBox)sender, Validator.CheckDecimal((TextBox)sender, false, 3, 2, true)); if (SeasonModifierRelInput.Text.Length > 0 && SeasonModifierAbsInput.Text.Length > 0) SeasonModifierAbsInput.Text = ""; SeasonModifier_Changed(sender, evt); } private void SeasonModifierAbsInput_TextChanged(object sender, TextChangedEventArgs evt) { if (SeasonList.SelectedItem is not Season s) return; InputTextChanged((TextBox)sender, Validator.CheckDecimal((TextBox)sender, false, 2, s.Precision, true)); if (SeasonModifierAbsInput.Text.Length > 0 && SeasonModifierRelInput.Text.Length > 0) SeasonModifierRelInput.Text = ""; SeasonModifier_Changed(sender, evt); } } }