// Promjenjena vjerojatnost nekog simbola void Changed(Dial sender) { if (!Params.Children.Contains(sender)) { return; } // Kolika bi trebala biti vrijednost posljednje vjerojatnosti? int next = 100 - Params.Children.OfType <Dial>().Aggregate(0, (a, i) => a + (int)i.RawValue) + (int)Last.RawValue; if (next < 1) // Ako je 0 ili manje, prelazimo preko 100% { Dispatcher.InvokeAsync(() => sender.RawValue += next - 1); // Vrati vrijednost simbola na maksimalnu dozvoljenu } else { Last.RawValue = next; // Prilagodi posljednju vjerojatnost } }
// Brisanje nekog simbola void Removed(object sender, RoutedEventArgs e) { if (Params.Children.Count <= 2) { return; // Aritmetički kod nema smisla za samo jedan simbol } Dial removing = (Dial)((ContextMenu)FindResource("Remove")).PlacementTarget; removing.Changed -= Changed; Last.RawValue += removing.RawValue; // Namjesti nazive simbola for (int i = Params.Children.IndexOf(removing) + 1; i < Params.Children.Count; i++) { ((Dial)Params.Children[i]).Title = ArithmeticCode.PName(i - 1).ToString(); } Params.Children.Remove(removing); CanExecute(); }
// Dodavanje novog simbola void Added() { if (Last.RawValue < 2 || Params.Children.Count >= 26) { return; // Do 26 slova, moguće proširiti uz bolje imenovanje } Dial param = new Dial(); param.RawValue = Last.RawValue / 2; Last.RawValue -= param.RawValue; param.Changed += Changed; param.ContextMenu = (ContextMenu)FindResource("Remove"); int i = Params.Children.Count - 1; param.Title = ArithmeticCode.PName(i).ToString(); // Nazivi simbola Last.Title = ArithmeticCode.PName(i + 1).ToString(); Params.Children.Insert(i, param); CanExecute(); }