//This creates or updates the portion of the context menu content which depends on the model type private static void SetCustomCMItems(ContextMenu cm, Neuron n, Neuron.modelType newModel) { while (cm.Items[2].GetType().Name != "Separator") { cm.Items.RemoveAt(2); } //The charge value formatted based on the model if (newModel == Neuron.modelType.Color) { cm.Items.Insert(2, Utils.CreateComboBox("CurrentCharge", n.LastChargeInt, colorValues, colorFormatString, "Content: ", 80, ComboBox_ContentChanged)); } else if (newModel == Neuron.modelType.FloatValue) { cm.Items.Insert(2, Utils.CreateComboBox("CurrentCharge", n.lastCharge, currentChargeValues, floatValueFormatString, "Content: ", 80, ComboBox_ContentChanged)); } else { cm.Items.Insert(2, Utils.CreateComboBox("CurrentCharge", n.lastCharge, currentChargeValues, floatFormatString, "Charge: ", 80, ComboBox_ContentChanged)); } if (newModel == Neuron.modelType.LIF) { cm.Items.Insert(3, Utils.CreateComboBox("LeakRate", Math.Abs(n.leakRate), leakRateValues, floatFormatString, "Leak Rate: ", 80, ComboBox_ContentChanged)); cm.Items.Insert(4, Utils.CreateComboBox("AxonDelay", n.axonDelay, axonDelayValues, intFormatString, "AxonDelay: ", 80, ComboBox_ContentChanged)); } else if (newModel == Neuron.modelType.Always) { cm.Items.Insert(3, Utils.CreateComboBox("AxonDelay", n.axonDelay, alwaysDelayValues, intFormatString, "Period: ", 80, ComboBox_ContentChanged)); } else if (newModel == Neuron.modelType.Random) { cm.Items.Insert(3, Utils.CreateComboBox("AxonDelay", n.axonDelay, meanValues, intFormatString, "Mean: ", 80, ComboBox_ContentChanged)); cm.Items.Insert(4, Utils.CreateComboBox("LeakRate", Math.Abs(n.leakRate), stdDevValues, floatFormatString, "Std Dev: ", 80, ComboBox_ContentChanged)); } else if (newModel == Neuron.modelType.Burst) { cm.Items.Insert(3, Utils.CreateComboBox("AxonDelay", n.axonDelay, alwaysDelayValues, intFormatString, "Count: ", 80, ComboBox_ContentChanged)); cm.Items.Insert(4, Utils.CreateComboBox("LeakRate", Math.Abs(n.leakRate), axonDelayValues, intFormatString, "Rate: ", 80, ComboBox_ContentChanged)); } }
//change the model for all selected neurons if this one is in the selection private static void Cb_SelectionChanged(object sender, SelectionChangedEventArgs e) { ComboBox cb = sender as ComboBox; StackPanel sp = cb.Parent as StackPanel; ContextMenu cm = sp.Parent as ContextMenu; int neuronID = (int)cm.GetValue(NeuronIDProperty); ListBoxItem lbi = (ListBoxItem)cb.SelectedItem; Neuron.modelType nm = (Neuron.modelType)System.Enum.Parse(typeof(Neuron.modelType), lbi.Content.ToString()); Neuron n = MainWindow.theNeuronArray.GetNeuron(neuronID); n.Model = nm; SetModelAndLeakrate(n); cm.IsOpen = false; }
//change the model and update the context menu private static void Cb_SelectionChanged(object sender, SelectionChangedEventArgs e) { modelChanged = true; ComboBox cb = sender as ComboBox; StackPanel sp = cb.Parent as StackPanel; MenuItem mi = sp.Parent as MenuItem; ContextMenu cm = mi.Parent as ContextMenu; int neuronID = (int)cm.GetValue(NeuronIDProperty); ListBoxItem lbi = (ListBoxItem)cb.SelectedItem; Neuron.modelType nm = (Neuron.modelType)System.Enum.Parse(typeof(Neuron.modelType), lbi.Content.ToString()); Neuron n = MainWindow.theNeuronArray.GetNeuron(neuronID); SetCustomCMItems(cm, n, nm); }
private static void ComboBox_ContentChanged(object sender, object e) { if (sender is ComboBox cb) { if (!cb.IsArrangeValid) { return; } cb.IsDropDownOpen = true;; if (cb.Name == "LeakRate") { leakRateChanged = true; Utils.ValidateInput(cb, -1, 1); } if (cb.Name == "AxonDelay") { axonDelayChanged = true; Utils.ValidateInput(cb, 0, int.MaxValue, "Int"); } if (cb.Name == "CurrentCharge") { chargeChanged = true; //all this to get the updated neuron model to set up the correct validation string validation = ""; StackPanel sp = cb.Parent as StackPanel; MenuItem mi = sp.Parent as MenuItem; ContextMenu cm = mi.Parent as ContextMenu; ComboBox cb1 = (ComboBox)Utils.FindByName(cm, "Model"); ListBoxItem lbi = (ListBoxItem)cb1.SelectedItem; Neuron.modelType nm = (Neuron.modelType)System.Enum.Parse(typeof(Neuron.modelType), lbi.Content.ToString()); if (nm == Neuron.modelType.Color) { validation = "Hex"; } Utils.ValidateInput(cb, 0, 1, validation); } } }
private static void Cm_Closed(object sender, RoutedEventArgs e) { if (sender is ContextMenu cm) { if (!cm.IsOpen) { return; } cm.IsOpen = false; if (cmCancelled) { MainWindow.Update(); return; } MainWindow.theNeuronArray.SetUndoPoint(); int neuronID = (int)cm.GetValue(NeuronIDProperty); Neuron n = MainWindow.theNeuronArray.GetNeuron(neuronID); n.AddUndoInfo(); bool applyToAll = false; Control cc = Utils.FindByName(cm, "ApplyToSelection"); if (cc is CheckBox cb) { if (cb.IsChecked == true) { applyToAll = true; } } cc = Utils.FindByName(cm, "Label"); if (cc is TextBox tb) { string newLabel = tb.Text; if (int.TryParse(newLabel, out int dummy)) { newLabel = "_" + newLabel; } if (labelChanged) { MainWindow.theNeuronArray.SetUndoPoint(); n.Label = newLabel; if (applyToAll) { SetValueInSelectedNeurons(n, "label"); } } } cc = Utils.FindByName(cm, "Model"); if (cc is ComboBox cb0) { ListBoxItem lbi = (ListBoxItem)cb0.SelectedItem; Neuron.modelType nm = (Neuron.modelType)System.Enum.Parse(typeof(Neuron.modelType), lbi.Content.ToString()); if (modelChanged) { n.model = nm; if (applyToAll) { SetValueInSelectedNeurons(n, "model"); } } } cc = Utils.FindByName(cm, "CurrentCharge"); if (cc is ComboBox tb1) { if (n.model == Neuron.modelType.Color) { try { uint newCharge = Convert.ToUInt32(tb1.Text, 16); if (chargeChanged) { n.SetValueInt((int)newCharge); n.lastCharge = newCharge; if (applyToAll) { SetValueInSelectedNeurons(n, "currentCharge"); } Utils.AddToValues(newCharge, colorValues); } } catch { }; } else { float.TryParse(tb1.Text, out float newCharge); if (chargeChanged) { n.SetValue(newCharge); n.lastCharge = newCharge; if (applyToAll) { SetValueInSelectedNeurons(n, "currentCharge"); } Utils.AddToValues(newCharge, currentChargeValues); } } } cc = Utils.FindByName(cm, "LeakRate"); if (cc is ComboBox tb2) { float.TryParse(tb2.Text, out float leakRate); if (leakRateChanged) { n.LeakRate = leakRate; if (applyToAll) { SetValueInSelectedNeurons(n, "leakRate"); } if (n.model == Neuron.modelType.LIF) { Utils.AddToValues(leakRate, leakRateValues); } if (n.model == Neuron.modelType.Random) { Utils.AddToValues(leakRate, stdDevValues); } if (n.model == Neuron.modelType.Burst) { Utils.AddToValues(leakRate, axonDelayValues); } } } else { n.leakRate = 0; } cc = Utils.FindByName(cm, "AxonDelay"); if (cc is ComboBox tb3) { int.TryParse(tb3.Text, out int axonDelay); if (axonDelayChanged) { n.axonDelay = axonDelay; if (applyToAll) { SetValueInSelectedNeurons(n, "axonDelay"); } if (n.model == Neuron.modelType.Random) { Utils.AddToValues(axonDelay, meanValues); } else if (n.model == Neuron.modelType.Always) { Utils.AddToValues(axonDelay, alwaysDelayValues); } else if (n.model == Neuron.modelType.Burst) { Utils.AddToValues(axonDelay, alwaysDelayValues); } else { Utils.AddToValues(axonDelay, axonDelayValues); } } } cc = Utils.FindByName(cm, "Synapses"); if (cc is CheckBox cb2) { if (synapsesChanged) { if (cb2.IsChecked == true) { MainWindow.arrayView.AddShowSynapses(n.id); } else { MainWindow.arrayView.RemoveShowSynapses(n.id); } if (applyToAll) { SetValueInSelectedNeurons(n, "synapses"); } } } cc = Utils.FindByName(cm, "Enabled"); if (cc is CheckBox cb1) { if (enabledChanged) { if (cb1.IsChecked == true) { n.leakRate = Math.Abs(n.leakRate); } else { n.leakRate = Math.Abs(n.leakRate) * -1.0f; } if (applyToAll) { SetValueInSelectedNeurons(n, "enable"); } } } cc = Utils.FindByName(cm, "History"); if (cc is CheckBox cb3) { if (historyChanged) { if (cb3.IsChecked == true) { FiringHistory.AddNeuronToHistoryWindow(n.id); OpenHistoryWindow(); } else { FiringHistory.RemoveNeuronFromHistoryWindow(n.id); } if (applyToAll) { SetValueInSelectedNeurons(n, "history"); } } } n.Update(); } MainWindow.Update(); }
public static void CreateContextMenu(int i, Neuron n, ContextMenu cm) { cmCancelled = false; labelChanged = false; modelChanged = false; enabledChanged = false; historyChanged = false; synapsesChanged = false; chargeChanged = false; leakRateChanged = false; axonDelayChanged = false; n = MainWindow.theNeuronArray.AddSynapses(n); cm.SetValue(NeuronIDProperty, n.Id); cm.Closed += Cm_Closed; cm.Opened += Cm_Opened; cm.PreviewKeyDown += Cm_PreviewKeyDown; cmCancelled = false; cm.StaysOpen = true; //The neuron label StackPanel sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "ID: " + n.id + " Label: ", VerticalAlignment = VerticalAlignment.Center, Padding = new Thickness(0) }); TextBox tb = Utils.ContextMenuTextBox(n.Label, "Label", 150); tb.TextChanged += Tb_TextChanged; sp.Children.Add(tb); sp.Children.Add(new Label { Content = "Warning:\rDuplicate Label", FontSize = 8, Name = "DupWarn", Visibility = Visibility.Hidden }); // cm.Items.Add(sp); //MenuItem mi = new MenuItem { StaysOpenOnClick = true, Header = new TextBox { Text = "Harry" } }; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = sp }); //The neuron model sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Model: ", Padding = new Thickness(0) }); ComboBox cb = new ComboBox() { Width = 100, Name = "Model" }; for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++) { Neuron.modelType model = (Neuron.modelType)index; cb.Items.Add(new ListBoxItem() { Content = model.ToString(), ToolTip = Neuron.modelToolTip[index], Width = 100, }); } cb.SelectedIndex = (int)n.Model; cb.SelectionChanged += Cb_SelectionChanged; sp.Children.Add(cb); cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = sp }); cm.Items.Add(new Separator()); MenuItem mi = new MenuItem(); CheckBox cbShowSynapses = new CheckBox { IsChecked = (n.leakRate > 0) || float.IsPositiveInfinity(1.0f / n.leakRate), Content = "Enabled", Name = "Enabled", }; cbShowSynapses.Checked += CbCheckedChanged; cbShowSynapses.Unchecked += CbCheckedChanged; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = cbShowSynapses }); cbShowSynapses = new CheckBox { IsChecked = MainWindow.arrayView.IsShowingSnapses(n.id), Content = "Show Synapses", Name = "Synapses", }; cbShowSynapses.Checked += CbCheckedChanged; cbShowSynapses.Unchecked += CbCheckedChanged; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = cbShowSynapses }); mi = new MenuItem(); CheckBox cbHistory = new CheckBox { IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id), Content = "Record Firing History", Name = "History", }; cbHistory.Checked += CbCheckedChanged; cbHistory.Unchecked += CbCheckedChanged; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = cbHistory }); mi = new MenuItem(); mi.Header = "Synapses Out"; foreach (Synapse s in n.Synapses) { string targetLabel = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label; MenuItem synapseMenuItem = new MenuItem() { Header = s.targetNeuron.ToString().PadLeft(8) + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New") }; synapseMenuItem.Click += Mi_Click; synapseMenuItem.PreviewMouseRightButtonDown += SynapseMenuItem_PreviewMouseRightButtonDown; synapseMenuItem.ToolTip = "L-click -> target neuron, R-Click -> edit synapse"; mi.Items.Add(synapseMenuItem); } cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Synapses In"; foreach (Synapse s in n.SynapsesFrom) { string targetLabel = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label; MenuItem synapseMenuItem = new MenuItem() { Header = s.targetNeuron.ToString().PadLeft(8) + " " + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New") }; synapseMenuItem.Click += Mi_Click; synapseMenuItem.PreviewMouseRightButtonDown += SynapseFromMenuItem_PreviewMouseRightButtonDown1; synapseMenuItem.ToolTip = "L-click -> source neuron, R-Click -> edit synapse"; mi.Items.Add(synapseMenuItem);; } cm.Items.Add(mi); mi = new MenuItem { Header = "Paste Here" }; if (MainWindow.myClipBoard == null) { mi.IsEnabled = false; } mi.Click += Mi_Click; cm.Items.Add(mi); mi = new MenuItem { Header = "Move Here" }; if (MainWindow.arrayView.theSelection.selectedRectangles.Count == 0) { mi.IsEnabled = false; } mi.Click += Mi_Click; cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Connect Multiple Synapses"; mi.Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "From Selection to Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "From Here to Selection" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Mutual Suppression" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; cm.Items.Add(mi); if (NeuronInSelection(n.id)) { cbShowSynapses = new CheckBox { IsChecked = true, Content = "Apply changes to all neurons in selection", Name = "ApplyToSelection", }; cbShowSynapses.Checked += CbCheckedChanged; cbShowSynapses.Unchecked += CbCheckedChanged; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = cbShowSynapses }); } sp = new StackPanel { Orientation = Orientation.Horizontal }; Button b0 = new Button { Content = "OK", Width = 100, Height = 25, Margin = new Thickness(10) }; b0.Click += B0_Click; sp.Children.Add(b0); b0 = new Button { Content = "Cancel", Width = 100, Height = 25, Margin = new Thickness(10) }; b0.Click += B0_Click; sp.Children.Add(b0); cm.Items.Add(new MenuItem { Header = sp, StaysOpenOnClick = true }); SetCustomCMItems(cm, n, n.model); }
public static void CreateContextMenu(int i, Neuron n, ContextMenu cm) { n = MainWindow.theNeuronArray.AddSynapses(n); cm.SetValue(NeuronIDProperty, n.Id); cm.Closed += Cm_Closed; cmCancelled = false; StackPanel sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Charge: ", Padding = new Thickness(0) }); if (n.Model == Neuron.modelType.FloatValue) { sp.Children.Add(new TextBox { Text = n.CurrentCharge.ToString("f2"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center }); } else if (n.model == Neuron.modelType.Color) { sp.Children.Add(new TextBox { Text = n.LastChargeInt.ToString("X"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center }); } else { sp.Children.Add(new TextBox { Text = n.LastCharge.ToString("f2"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center }); } cm.Items.Add(sp); if (n.Model == Neuron.modelType.LIF || n.model == Neuron.modelType.Random) { sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Leak Rate: ", Padding = new Thickness(0) }); sp.Children.Add(new TextBox { Text = n.LeakRate.ToString("f4"), Width = 60, Name = "LeakRate", VerticalAlignment = VerticalAlignment.Center }); cm.Items.Add(sp); } MenuItem mi = new MenuItem(); mi.Header = "Neuron ID: " + n.Id; cm.Items.Add(mi); cm.Items.Add(new Separator()); mi = new MenuItem(); mi.Header = "Always Fire"; mi.Click += Mi_Click; cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Paste Here"; mi.Click += Mi_Click; cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Clipboard"; mi.Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Paste Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Move Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Connect to Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Connect from Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Select as Target" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; cm.Items.Add(mi); sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Label: ", Padding = new Thickness(0) }); sp.Children.Add(new TextBox { Text = n.Label, Width = 150, Name = "Label", VerticalAlignment = VerticalAlignment.Center }); cm.Items.Add(sp); sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Model: ", Padding = new Thickness(0) }); ComboBox cb = new ComboBox() { Width = 100 }; for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++) { Neuron.modelType model = (Neuron.modelType)index; cb.Items.Add(new ListBoxItem() { Content = model.ToString(), ToolTip = Neuron.modelToolTip[index], Width = 100, }); } cb.SelectedIndex = (int)n.Model; cb.SelectionChanged += Cb_SelectionChanged; sp.Children.Add(cb); cm.Items.Add(sp); CheckBox cbHistory = new CheckBox { IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id), Content = "Record Firing History", Name = "History", }; cbHistory.Checked += CbHistory_Checked; cbHistory.Unchecked += CbHistory_Checked; cm.Items.Add(cbHistory); mi = new MenuItem(); mi.Header = "Synapses"; foreach (Synapse s in n.Synapses) { string targetLabel = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label; MenuItem synapseMenuItem = new MenuItem() { Header = s.targetNeuron.ToString().PadLeft(8) + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New") }; synapseMenuItem.Click += Mi_Click; synapseMenuItem.PreviewMouseRightButtonDown += SynapseMenuItem_PreviewMouseRightButtonDown; synapseMenuItem.ToolTip = "L-click -> target neuron, R-Click -> edit synapse"; mi.Items.Add(synapseMenuItem); } cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Synapses In"; foreach (Synapse s in n.SynapsesFrom) { string targetLabel = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label; MenuItem synapseMenuItem = new MenuItem() { Header = s.targetNeuron.ToString().PadLeft(8) + " " + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New") }; synapseMenuItem.Click += Mi_Click; synapseMenuItem.PreviewMouseRightButtonDown += SynapseFromMenuItem_PreviewMouseRightButtonDown1; synapseMenuItem.ToolTip = "L-click -> source neuron, R-Click -> edit synapse"; mi.Items.Add(synapseMenuItem);; } cm.Items.Add(mi); }
public static void CreateContextMenu(int i, Neuron n, ContextMenu cm) { cm.SetValue(NeuronIDProperty, n.Id); cm.Closed += Cm_Closed; cmCancelled = false; StackPanel sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Charge: ", Padding = new Thickness(0) }); if (n.Model != Neuron.modelType.FloatValue) { sp.Children.Add(new TextBox { Text = n.LastCharge.ToString("f2"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center }); } else { sp.Children.Add(new TextBox { Text = n.CurrentCharge.ToString("f2"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center }); } cm.Items.Add(sp); if (n.Model == Neuron.modelType.LIF) { sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Leak Rate: ", Padding = new Thickness(0) }); sp.Children.Add(new TextBox { Text = n.LeakRate.ToString("f4"), Width = 60, Name = "LeakRate", VerticalAlignment = VerticalAlignment.Center }); cm.Items.Add(sp); } MenuItem mi = new MenuItem(); mi.Header = "Neuron ID: " + n.Id; cm.Items.Add(mi); cm.Items.Add(new Separator()); mi = new MenuItem(); mi.Header = "Always Fire"; mi.Click += Mi_Click; cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Paste Here"; mi.Click += Mi_Click; cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Clipboard"; mi.Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Paste Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Move Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Connect to Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Connect from Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Select as Target" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; cm.Items.Add(mi); sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Label: ", Padding = new Thickness(0) }); sp.Children.Add(new TextBox { Text = n.Label, Width = 150, Name = "Label", VerticalAlignment = VerticalAlignment.Center }); cm.Items.Add(sp); sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Model: ", Padding = new Thickness(0) }); ComboBox cb = new ComboBox() { Width = 100 }; for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++) { Neuron.modelType model = (Neuron.modelType)index; cb.Items.Add(new ListBoxItem() { Content = model.ToString(), ToolTip = Neuron.modelToolTip[index], Width = 100, }); } cb.SelectedIndex = (int)n.Model; cb.SelectionChanged += Cb_SelectionChanged; sp.Children.Add(cb); cm.Items.Add(sp); CheckBox cbHistory = new CheckBox { IsChecked = n.KeepHistory, Content = "Record Firing History", Name = "History", }; cbHistory.Checked += CbHistory_Checked; cbHistory.Unchecked += CbHistory_Checked; cm.Items.Add(cbHistory); mi = new MenuItem(); mi.Header = "Synapses"; mi.Click += Mi_Click; if (n.synapses == null) { n.synapses = new List <Synapse>(); } foreach (Synapse s in n.synapses) { mi.Items.Add(new MenuItem() { Header = s.targetNeuron + " " + s.Weight }); } cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Synapses In"; mi.Click += Mi_Click; if (n.synapsesFrom == null) { n.synapsesFrom = new List <Synapse>(); } foreach (Synapse s in n.synapsesFrom) { mi.Items.Add(new MenuItem() { Header = s.targetNeuron + " " + s.Weight }); } cm.Items.Add(mi); }
public static ContextMenu CreateContextMenu(int i, Neuron n, ContextMenu cm) { cmCancelled = false; labelChanged = false; toolTipChanged = false; modelChanged = false; enabledChanged = false; historyChanged = false; synapsesChanged = false; chargeChanged = false; leakRateChanged = false; axonDelayChanged = false; n = MainWindow.theNeuronArray.AddSynapses(n); cm.SetValue(NeuronIDProperty, n.Id); cm.Closed += Cm_Closed; cm.Opened += Cm_Opened; cm.PreviewKeyDown += Cm_PreviewKeyDown; cmCancelled = false; cm.StaysOpen = true; cm.Width = 300; //The neuron label MenuItem mi1 = new MenuItem { Header = "ID: " + n.id, Padding = new Thickness(0) }; cm.Items.Add(mi1); //apply to all in selection CheckBox cbApplyToSelection = new CheckBox { IsChecked = true, Content = "Apply changes to all neurons in selection", Name = "ApplyToSelection", }; cbApplyToSelection.Checked += CbCheckedChanged; cbApplyToSelection.Unchecked += CbCheckedChanged; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = cbApplyToSelection }); if (MainWindow.arrayView.theSelection.selectedRectangles.Count > 0) { cbApplyToSelection.IsEnabled = true; cbApplyToSelection.IsChecked = NeuronInSelection(n.id); } else { cbApplyToSelection.IsChecked = false; cbApplyToSelection.IsEnabled = false; } //label StackPanel sp = new StackPanel { Orientation = Orientation.Horizontal, }; sp.Children.Add(new Label { Content = "Label: ", Padding = new Thickness(0), VerticalAlignment = VerticalAlignment.Center, });; TextBox tb = Utils.ContextMenuTextBox(n.Label, "Label", 170); tb.TextChanged += Tb_TextChanged; sp.Children.Add(tb); sp.Children.Add(new Label { Content = "Warning: Duplicate Label", FontSize = 8, Name = "DupWarn", Visibility = Visibility.Hidden }); mi1 = new MenuItem { StaysOpenOnClick = true, Header = sp }; cm.Items.Add(mi1); //tooltip if (n.Label != "" || n.ToolTip != "") //add the tooltip textbox if needed { sp = new StackPanel { Orientation = Orientation.Horizontal }; sp.Children.Add(new Label { Content = "Tooltip: ", VerticalAlignment = VerticalAlignment.Center, Padding = new Thickness(0) }); tb = Utils.ContextMenuTextBox(n.ToolTip, "ToolTip", 150); tb.TextChanged += Tb_TextChanged; sp.Children.Add(tb); cm.Items.Add(sp); } //The neuron model sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Model: ", Padding = new Thickness(0) }); ComboBox cb = new ComboBox() { Width = 80, Name = "Model" }; for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++) { Neuron.modelType model = (Neuron.modelType)index; cb.Items.Add(new ListBoxItem() { Content = model.ToString(), ToolTip = Neuron.modelToolTip[index], Width = 100, }); } cb.SelectedIndex = (int)n.Model; cb.SelectionChanged += Cb_SelectionChanged; sp.Children.Add(cb); cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = sp }); cm.Items.Add(new Separator { Visibility = Visibility.Collapsed }); cm.Items.Add(new Separator { Visibility = Visibility.Collapsed }); MenuItem mi = new MenuItem(); CheckBox cbEnableNeuron = new CheckBox { IsChecked = (n.leakRate > 0) || float.IsPositiveInfinity(1.0f / n.leakRate), Content = "Enabled", Name = "Enabled", }; cbEnableNeuron.Checked += CbCheckedChanged; cbEnableNeuron.Unchecked += CbCheckedChanged; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = cbEnableNeuron }); CheckBox cbShowSynapses = new CheckBox { IsChecked = MainWindow.arrayView.IsShowingSynapses(n.id), Content = "Show Synapses", Name = "Synapses", }; cbShowSynapses.Checked += CbCheckedChanged; cbShowSynapses.Unchecked += CbCheckedChanged; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = cbShowSynapses }); mi = new MenuItem(); CheckBox cbHistory = new CheckBox { IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id), Content = "Record Firing History", Name = "History", }; cbHistory.Checked += CbCheckedChanged; cbHistory.Unchecked += CbCheckedChanged; cm.Items.Add(new MenuItem { StaysOpenOnClick = true, Header = cbHistory }); mi = new MenuItem { Header = "Clear Synapses" }; mi.Click += Mi_Click; cm.Items.Add(mi); cm.Items.Add(new Separator()); cm.Items.Add(new Separator()); mi = new MenuItem(); mi.Header = "Synapses Out"; mi.Width = 250; mi.HorizontalAlignment = HorizontalAlignment.Left; foreach (Synapse s in n.Synapses) { AddSynapseEntryToMenu(mi, s); } cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Synapses In"; mi.Width = 250; mi.HorizontalAlignment = HorizontalAlignment.Left; foreach (Synapse s in n.SynapsesFrom) { AddSynapseEntryToMenu(mi, s); } cm.Items.Add(mi); mi = new MenuItem { Header = "Paste Here" }; if (!XmlFile.WindowsClipboardContainsNeuronArray()) { mi.IsEnabled = false; } mi.Click += Mi_Click; cm.Items.Add(mi); mi = new MenuItem { Header = "Move Here" }; if (MainWindow.arrayView.theSelection.selectedRectangles.Count == 0) { mi.IsEnabled = false; } mi.Click += Mi_Click; cm.Items.Add(mi); mi = new MenuItem(); mi.Header = "Connect Multiple Synapses"; mi.Width = 250; mi.HorizontalAlignment = HorizontalAlignment.Left; mi.Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "From Selection to Here" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "From Here to Selection" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; mi.Items.Add(new MenuItem() { Header = "Mutual Suppression" }); ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click; cm.Items.Add(mi); sp = new StackPanel { Orientation = Orientation.Horizontal }; Button b0 = new Button { Content = "OK", Width = 100, Height = 25, Margin = new Thickness(10) }; b0.Click += B0_Click; sp.Children.Add(b0); b0 = new Button { Content = "Cancel", Width = 100, Height = 25, Margin = new Thickness(10) }; b0.Click += B0_Click; sp.Children.Add(b0); cm.Items.Add(new MenuItem { Header = sp, StaysOpenOnClick = true }); SetCustomCMItems(cm, n, n.model); return(cm); }
//This creates or updates the portion of the context menu content which depends on the model type private static void SetCustomCMItems(ContextMenu cm, Neuron n, Neuron.modelType newModel) { //find first seperator; int insertPosition = 0; for (int i = 0; i < cm.Items.Count; i++) { if (cm.Items[i].GetType() == typeof(Separator)) { insertPosition = i + 1; while (i + 1 < cm.Items.Count && cm.Items[i + 1].GetType() != typeof(Separator)) { cm.Items.RemoveAt(i + 1); } break; } } //The charge value formatted based on the model if (newModel == Neuron.modelType.Color) { StackPanel sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Content: " }); ComboBox cb0 = (Utils.CreateComboBox("CurrentCharge", n.LastChargeInt, colorValues, colorFormatString, 80, ComboBox_ContentChanged)); sp.Children.Add(cb0); for (int i = 0; i < cb0.Items.Count; i++) { string cc = cb0.Items[i].ToString(); cb0.Items[i] = new Label { Content = cc }; if (int.TryParse(cc, System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int colorValue)) { System.Drawing.Color col = System.Drawing.ColorTranslator.FromWin32(colorValue); if (col.R * 0.2126 + col.G * 0.7152 + col.B * 0.0722 < 255 / 2) { //dark color ((Label)cb0.Items[i]).Foreground = new SolidColorBrush(Utils.IntToColor(0xffffff)); } ((Label)cb0.Items[i]).Background = new SolidColorBrush(Utils.IntToColor(colorValue)); } } cm.Items.Insert(insertPosition + 1, new MenuItem { Header = sp, StaysOpenOnClick = true }); } else if (newModel == Neuron.modelType.FloatValue) { cm.Items.Insert(insertPosition, Utils.CreateComboBoxMenuItem("CurrentCharge", n.lastCharge, currentChargeValues, floatValueFormatString, "Content: ", 80, ComboBox_ContentChanged)); } else { cm.Items.Insert(insertPosition, Utils.CreateComboBoxMenuItem("CurrentCharge", n.lastCharge, currentChargeValues, floatFormatString, "Charge: ", 80, ComboBox_ContentChanged)); } if (newModel == Neuron.modelType.LIF) { cm.Items.Insert(insertPosition + 1, Utils.CreateComboBoxMenuItem("LeakRate", Math.Abs(n.leakRate), leakRateValues, floatFormatString, "Leak Rate: ", 80, ComboBox_ContentChanged)); cm.Items.Insert(insertPosition + 2, Utils.CreateComboBoxMenuItem("AxonDelay", n.axonDelay, axonDelayValues, intFormatString, "AxonDelay: ", 80, ComboBox_ContentChanged)); } else if (newModel == Neuron.modelType.Always) { StackPanel sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3) }; sp.Children.Add(new Label { Content = "Period: " }); ComboBox cb0 = (Utils.CreateComboBox("AxonDelay", n.axonDelay, alwaysDelayValues, intFormatString, 80, ComboBox_ContentChanged)); sp.Children.Add(cb0); Slider sl = new Slider { Width = 100, Margin = new Thickness(10, 4, 0, 0), Value = 10, Maximum = 10 }; sl.ValueChanged += Sl_ValueChanged; sp.Children.Add(sl); cm.Items.Insert(insertPosition + 1, new MenuItem { Header = sp, StaysOpenOnClick = true }); } else if (newModel == Neuron.modelType.Random) { cm.Items.Insert(insertPosition + 1, Utils.CreateComboBoxMenuItem("AxonDelay", n.axonDelay, meanValues, intFormatString, "Mean: ", 80, ComboBox_ContentChanged)); cm.Items.Insert(insertPosition + 2, Utils.CreateComboBoxMenuItem("LeakRate", Math.Abs(n.leakRate), stdDevValues, floatFormatString, "Std Dev: ", 80, ComboBox_ContentChanged)); } else if (newModel == Neuron.modelType.Burst) { cm.Items.Insert(insertPosition + 1, Utils.CreateComboBoxMenuItem("AxonDelay", n.axonDelay, alwaysDelayValues, intFormatString, "Count: ", 80, ComboBox_ContentChanged)); cm.Items.Insert(insertPosition + 2, Utils.CreateComboBoxMenuItem("LeakRate", Math.Abs(n.leakRate), axonDelayValues, intFormatString, "Rate: ", 80, ComboBox_ContentChanged)); } }