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 });
}