private void ReallyDraw() { theCanvas.Children.Clear(); theCanvas2.Children.Clear(); long maxX = MainWindow.theNeuronArray.Generation; long minX = FiringHistory.EarliestValue(); if (minX <= maxX) //any samples? { Point windowSize = new Point(theCanvas.ActualWidth, theCanvas.ActualHeight); double xScale = windowSize.X / (maxX - minX); double yDelta = windowSize.Y / (FiringHistory.history.Count + 1); for (int i = 0; i < FiringHistory.history.Count; i++) { double yPos0 = yDelta * (i + 1); double yPos1 = yPos0 - yDelta / 2; double yPos2 = yPos0 + yDelta / 10; Polyline pl = new Polyline() { Stroke = new SolidColorBrush(Colors.Black), StrokeThickness = 4, StrokeEndLineCap = PenLineCap.Round, }; pl.Points.Add(new Point(0, yPos0)); for (int j = 0; j < FiringHistory.history[i].Samples.Count; j++) { double X = (FiringHistory.history[i].Samples[j]); X -= minX; X *= xScale; pl.Points.Add(new Point(X, yPos0)); pl.Points.Add(new Point(X + xScale / 6, yPos1)); pl.Points.Add(new Point(X + xScale / 5, yPos1)); pl.Points.Add(new Point(X + xScale / 4, yPos2)); pl.Points.Add(new Point(X + xScale / 2, yPos0)); } pl.Points.Add(new Point(theCanvas.Width, yPos0)); theCanvas.Children.Add(pl); string label = "#" + FiringHistory.history[i].NeuronID.ToString(); if (MainWindow.theNeuronArray.GetNeuron(FiringHistory.history[i].NeuronID).Label != "") { label = MainWindow.theNeuronArray.GetNeuron(FiringHistory.history[i].NeuronID).Label; } Label l = new Label { Content = label, Foreground = new SolidColorBrush(Colors.White) }; l.MouseMove += L_MouseMove; l.MouseLeftButtonUp += L_MouseLeftButtonUp; Canvas.SetLeft(l, 10); Canvas.SetTop(l, yPos1); theCanvas2.Children.Add(l); } } }
private void btnDialogOk_Click(object sender, RoutedEventArgs e) { int.TryParse(txtColumns.Text, out int newCols); int.TryParse(txtRows.Text, out int newRows); int oldCols = MainWindow.theNeuronArray.arraySize / MainWindow.theNeuronArray.rows; int oldRows = MainWindow.theNeuronArray.rows; if (newCols < oldCols || newRows < oldRows) { MessageBox.Show("Can only make neuron array bigger."); return; } if (newCols != oldCols || newRows != oldRows) { MainWindow.arrayView.ClearSelection(); SelectionRectangle rr = new SelectionRectangle(0, oldCols, oldRows); MainWindow.arrayView.theSelection.selectedRectangles.Add(rr); MainWindow.arrayView.CopyNeurons(); MainWindow.arrayView.ClearSelection(); MainWindow.theNeuronArray = new NeuronArray(); MainWindow.theNeuronArray.Initialize(newRows * newCols, newRows); MainWindow.theNeuronArray.rows = newRows; MainWindow.arrayView.targetNeuronIndex = 0; MainWindow.arrayView.PasteNeurons(); MainWindow.theNeuronArray.ShowSynapses = true; MainWindow.thisWindow.SetShowSynapsesCheckBox(true); MainWindow.arrayView.ClearShowingSynapses(); FiringHistory.ClearAll(); MainWindow.CloseHistoryWindow(); } this.Close(); }
private void Clear_Click(object sender, RoutedEventArgs e) { FiringHistory.Clear(); wheelScale = 0; theCanvas.Width = scroller.ActualWidth; scroller.ScrollToRightEnd(); ReallyDraw(); }
public static void CloseHistoryWindow() { if (fwWindow != null) { fwWindow.Close(); } FiringHistory.Clear(); }
public void MoveOneNeuron(Neuron n, Neuron nNewLocation) { n.AddUndoInfo(); nNewLocation.AddUndoInfo(); //copy the neuron attributes and delete them from the old neuron. n.Copy(nNewLocation); MainWindow.theNeuronArray.SetCompleteNeuron(nNewLocation); if (FiringHistory.NeuronIsInFiringHistory(n.id)) { FiringHistory.RemoveNeuronFromHistoryWindow(n.id); FiringHistory.AddNeuronToHistoryWindow(nNewLocation.id); } //for all the synapses going out this neuron, change to going from new location //don't use a foreach here because the body of the loop may delete a list entry for (int k = 0; k < n.Synapses.Count; k++) { Synapse s = n.Synapses[k]; if (s.targetNeuron != n.id) { nNewLocation.AddSynapseWithUndo(s.targetNeuron, s.weight, s.model); } else { nNewLocation.AddSynapseWithUndo(nNewLocation.id, s.weight, s.model); } n.DeleteSynapseWithUndo(n.synapses[k].targetNeuron); } //for all the synapses coming into this neuron, change the synapse target to new location for (int k = 0; k < n.SynapsesFrom.Count; k++) { Synapse reverseSynapse = n.SynapsesFrom[k]; //(from synapses are sort-of backward if (reverseSynapse.targetNeuron != -1) //? { Neuron sourceNeuron = MainWindow.theNeuronArray.GetNeuron(reverseSynapse.targetNeuron); sourceNeuron.DeleteSynapseWithUndo(n.id); if (sourceNeuron.id != n.id) { sourceNeuron.AddSynapseWithUndo(nNewLocation.id, reverseSynapse.weight, reverseSynapse.model); } } } n.Clear(); }
private static void SetValueInSelectedNeurons(Neuron n, string property) { bool neuronInSelection = NeuronInSelection(n.id); if (neuronInSelection) { List <int> theNeurons = theNeuronArrayView.theSelection.EnumSelectedNeurons(); //special case for label because they are auto-incremented, //clear all the labels first to avoid collisions if (property == "label") { for (int i = 0; i < theNeurons.Count; i++) { Neuron n1 = MainWindow.theNeuronArray.GetNeuron(theNeurons[i]); if (n1.id != n.id) { n1.label = ""; n1.Update(); } } } for (int i = 0; i < theNeurons.Count; i++) { Neuron n1 = MainWindow.theNeuronArray.GetNeuron(theNeurons[i]); n1.AddUndoInfo(); switch (property) { case "currentCharge": if (n.model == Neuron.modelType.Color) { n1.SetValueInt(n.LastChargeInt); } else { n1.currentCharge = n.currentCharge; n1.lastCharge = n.currentCharge; } break; case "leakRate": n1.leakRate = n.leakRate; break; case "axonDelay": n1.axonDelay = n.axonDelay; break; case "model": n1.model = n.model; break; case "enable": n1.leakRate = n.leakRate; break; case "history": if (FiringHistory.NeuronIsInFiringHistory(n.id)) { FiringHistory.AddNeuronToHistoryWindow(n1.id); OpenHistoryWindow(); } else { FiringHistory.RemoveNeuronFromHistoryWindow(n1.id); } break; case "synapses": if (MainWindow.arrayView.IsShowingSnapses(n.id)) { MainWindow.arrayView.AddShowSynapses(n1.id); } else { MainWindow.arrayView.RemoveShowSynapses(n1.id); } break; case "label": if (n.label == "") { n1.label = ""; } else if (n.id != n1.id) { string newLabel = n.label; while (MainWindow.theNeuronArray.GetNeuron(newLabel) != null) { int num = 0; int digitCount = 0; while (Char.IsDigit(newLabel[newLabel.Length - 1])) { int.TryParse(newLabel[newLabel.Length - 1].ToString(), out int digit); num = num + (int)Math.Pow(10, digitCount) * digit; digitCount++; newLabel = newLabel.Substring(0, newLabel.Length - 1); } num++; newLabel = newLabel + num.ToString(); } n1.label = newLabel; } break; } n1.Update(); } } }
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); }
private void ReallyDraw() { refractoryPeriod = MainWindow.theNeuronArray.RefractoryDelay; refractoryPeriod++; theCanvas.Children.Clear(); theCanvas2.Children.Clear(); long maxX = MainWindow.theNeuronArray.Generation; long minX = FiringHistory.EarliestValue(); if (minX <= maxX) //any samples? { long sampleCount = maxX - minX; if (sampleCount > 100 && wheelScale == 0) { theCanvas.Width = scroller.ActualWidth * (float)sampleCount / 100f; scroller.ScrollToRightEnd(); } Point windowSize = new Point(theCanvas.Width, theCanvas.ActualHeight); double xScale = windowSize.X / (float)sampleCount; double yDelta = .9 * windowSize.Y / (FiringHistory.history.Count); yDelta = Math.Min(yDelta, 200); //TODO: The commented-out lines will create a smooth curve instead of the line approximation for (int i = 0; i < FiringHistory.history.Count; i++) { double yPos0 = yDelta * (i + 1); double yPos1 = yPos0 - yDelta * .85; double yPos15 = yPos0 - yDelta * .875; double yPos2 = yPos0 + yDelta / 20; double yPos3 = yPos0 + yDelta / 10; //PointCollection pc = new PointCollection(); Polyline pl = new Polyline() { Stroke = new SolidColorBrush(Colors.Black), StrokeThickness = 4, StrokeEndLineCap = PenLineCap.Round, StrokeLineJoin = PenLineJoin.Round, }; pl.Points.Add(new Point(0, yPos0)); // pc.Add(new Point(0, yPos0)); float lastValue = 0; for (int j = 0; j < FiringHistory.history[i].Samples.Count; j++) { double X = (FiringHistory.history[i].Samples[j].generation); float value = FiringHistory.history[i].Samples[j].value; float value1 = value; if (j < FiringHistory.history[i].Samples.Count - 1) { value1 = FiringHistory.history[i].Samples[j + 1].value; } X -= minX; X *= xScale; if (value >= 1) { double xDelta = xScale / 10; xDelta *= refractoryPeriod; if (lastValue == 1) { lastValue = 0; } float yPosLastValue = (float)(yPos0 - lastValue * yDelta / 3); pl.Points.Add(new Point(X, yPosLastValue)); pl.Points.Add(new Point(X + xDelta, yPos1)); pl.Points.Add(new Point(X + 1.1 * xDelta, yPos15)); pl.Points.Add(new Point(X + 1.2 * xDelta, yPos1)); pl.Points.Add(new Point(X + 2.2 * xDelta, yPos0)); pl.Points.Add(new Point(X + 2.5 * xDelta, yPos2)); pl.Points.Add(new Point(X + 3.5 * xDelta, yPos3)); pl.Points.Add(new Point(X + 4.2 * xDelta, yPos3)); pl.Points.Add(new Point(X + 6 * xDelta, yPos2)); pl.Points.Add(new Point(X + 9 * xDelta, yPos0)); j += refractoryPeriod - 1; //pc.Add(new Point(X, yPosLastValue)); //pc.Add(new Point(X + xDelta, yPos1)); //pc.Add(new Point(X + 2 * xDelta, yPos2)); //pc.Add(new Point(X + 3 * xDelta, yPos2)); //pc.Add(new Point(X + 5 * xDelta, yPos3)); //pc.Add(new Point(X + 9 * xDelta, yPos0)); } else { float yPosValue = (float)(yPos0 - value * yDelta / 3); pl.Points.Add(new Point(X, yPosValue)); if (value1 >= value) { pl.Points.Add(new Point(X + xScale * 9 / 10, yPosValue)); } //pc.Add(new Point(X, yPosValue)); } lastValue = value; } //pl.Points.Add(new Point(theCanvas.Width, yPos0)); //pc.Add(new Point(theCanvas.Width, yPos0)); //PolyBezierSegment pbs = new PolyBezierSegment { Points = pc }; //PathSegmentCollection psc = new PathSegmentCollection { pbs }; //PathFigure pf = new PathFigure { StartPoint = new Point(0, yPos0), Segments = psc }; //PathFigureCollection pfc = new PathFigureCollection { pf }; //PathGeometry pg = new PathGeometry { Figures = pfc }; //Path thePath = new Path { Stroke = Brushes.Green, StrokeThickness = 2, Data = pg }; theCanvas.Children.Add(pl); //theCanvas.Children.Add(thePath); string label = "#" + FiringHistory.history[i].NeuronID.ToString(); if (MainWindow.theNeuronArray.GetNeuron(FiringHistory.history[i].NeuronID).Label != "") { label = MainWindow.theNeuronArray.GetNeuron(FiringHistory.history[i].NeuronID).Label; } Label l = new Label { Content = label, Foreground = new SolidColorBrush(Colors.White), FontSize = yDelta / 3 }; l.MouseMove += L_MouseMove; l.MouseLeftButtonUp += L_MouseLeftButtonUp; Canvas.SetLeft(l, 10); Canvas.SetTop(l, yPos1); theCanvas2.Children.Add(l); theCanvas.Children.Add(new Line { X1 = 0, X2 = theCanvas.Width, Y1 = yPos0, Y2 = yPos0, Stroke = Brushes.Green, StrokeDashArray = new DoubleCollection { 3, 5 }, StrokeThickness = 2, }); theCanvas.Children.Add(new Line { X1 = 0, X2 = theCanvas.Width, Y1 = yPos0 - yDelta / 3, Y2 = yPos0 - yDelta / 3, Stroke = Brushes.Red, StrokeDashArray = new DoubleCollection { 3, 5 }, StrokeThickness = 2, }); } } }
private static void Cm_Closed(object sender, RoutedEventArgs e) { if ((Keyboard.GetKeyStates(Key.Escape) & KeyStates.Down) > 0) { return; } if (cmCancelled) { cmCancelled = false; return; } if (sender is ContextMenu cm) { int neuronID = (int)cm.GetValue(NeuronIDProperty); Neuron n = MainWindow.theNeuronArray.GetNeuron(neuronID); Control cc = Utils.FindByName(cm, "Label"); if (cc is TextBox tb) { n.Label = tb.Text; } cc = Utils.FindByName(cm, "CurrentCharge"); if (cc is TextBox tb1) { float.TryParse(tb1.Text, out float newCharge); n.SetValue(newCharge); } cc = Utils.FindByName(cm, "LeakRate"); if (cc is TextBox tb2) { float.TryParse(tb2.Text, out float leakRate); if (n.LeakRate != leakRate) { n.LeakRate = leakRate; SetModelAndLeakrate(n); } n.LeakRate = leakRate; } cc = Utils.FindByName(cm, "History"); if (cc is CheckBox cb1) { bool KeepHistory = (bool)cb1.IsChecked; if (!KeepHistory) { FiringHistory.RemoveNeuronFromHistoryWindow(n.Id); if (FiringHistory.history.Count == 0 && MainWindow.fwWindow != null && MainWindow.fwWindow.IsVisible) { MainWindow.fwWindow.Close(); MainWindow.fwWindow = null; } } else //make sure a window is open { FiringHistory.AddNeuronToHistoryWindow(n.id); OpenHistoryWindow(); } //if there is a selection, set all the keepHistory values to match bool neuronInSelection = false; foreach (NeuronSelectionRectangle sr in theNeuronArrayView.theSelection.selectedRectangles) { if (sr.NeuronIsInSelection(neuronID)) { neuronInSelection = true; break; } } if (neuronInSelection) { theNeuronArrayView.theSelection.EnumSelectedNeurons(); for (Neuron n1 = theNeuronArrayView.theSelection.GetSelectedNeuron(); n1 != null; n1 = theNeuronArrayView.theSelection.GetSelectedNeuron()) { if (KeepHistory) { FiringHistory.AddNeuronToHistoryWindow(n1.id); } else { FiringHistory.RemoveNeuronFromHistoryWindow(n1.id); } } //n1.KeepHistory = (bool)cb1.IsChecked; } } } MainWindow.Update(); }
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 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); }