public static void AddClojureSlider(string labelText, Var variable, double min, double max, int divisor, IFn func) { double variableVal = 0; string variableSymbolName = variable.sym.Name; Label label = new Label(); label.AutoSize = true; label.Text = labelText; if (!double.TryParse(variable.get().ToString(), out variableVal)) { label.Text = "Error: Could not convert variable '" + variableSymbolName + "' value of '" + variable.get().ToString() + "' to a numeric type"; self.AddNewClojureControl(label); return; } int iMin = (int)Math.Round(min * divisor); int iMax = (int)Math.Round(max * divisor); int iValue = (int)Math.Round(variableVal * divisor); NumericUpDown numericUpDown = new NumericUpDown(); TrackBar trackbar = new TrackBar(); bool disableNumbericUpDownUpdate = false; trackbar.AutoSize = false; trackbar.Width = 128; trackbar.Height = 24; trackbar.Minimum = iMin; trackbar.Maximum = iMax; trackbar.Value = iValue; trackbar.ValueChanged += (s, e) => { double tbVal = (double)trackbar.Value / divisor; ClojureEngine.Eval("(def " + variableSymbolName + " " + tbVal + ")"); disableNumbericUpDownUpdate = true; numericUpDown.Value = (decimal)tbVal; disableNumbericUpDownUpdate = false; if (func != null) { try { object res = func.invoke(); ClojureEngine.Log(res); } catch (Exception ex) { ClojureEngine.Log(ex.ToString()); } } }; Label valLabel = new Label(); valLabel.AutoSize = true; valLabel.Text = "Value: "; numericUpDown.DecimalPlaces = (int)Math.Log10(divisor) + 1; numericUpDown.Minimum = (decimal)min; numericUpDown.Maximum = (decimal)max; numericUpDown.Value = (decimal)trackbar.Value / divisor; numericUpDown.ValueChanged += (s, e) => { if (disableNumbericUpDownUpdate) return; trackbar.Value = (int)(numericUpDown.Value * divisor); }; Label minmaxLabel = new Label(); minmaxLabel.AutoSize = true; minmaxLabel.Text = "Min: " + min + ", Max: " + max; self.AddNewClojureControls(new Control[] { label, trackbar, valLabel, numericUpDown, minmaxLabel }); }
public static void AddClojureNumericUpDown(string labelText, Var variable, double min, double max, IFn func) { double variableVal = 0; string variableSymbolName = variable.sym.Name; Label label = new Label(); label.AutoSize = true; label.Text = labelText; if (!double.TryParse(variable.get().ToString(), out variableVal)) { label.Text = "Error: Could not convert variable '" + variableSymbolName + "' value of '" + variable.get().ToString() + "' to a numeric type"; self.AddNewClojureControl(label); return; } NumericUpDown numericUpDown = new NumericUpDown(); numericUpDown.DecimalPlaces = 8; numericUpDown.Increment = 0.01m; numericUpDown.Minimum = (decimal)min; numericUpDown.Maximum = (decimal)max; numericUpDown.Value = (decimal)variableVal; numericUpDown.ValueChanged += (s, e) => { double tbVal = (double)numericUpDown.Value; ClojureEngine.Eval("(def " + variableSymbolName + " " + tbVal + ")"); if (func != null) ClojureEngine.Log(func.invoke()); }; self.AddNewClojureControls(new Control[] { label, numericUpDown }); }