From 4fee6e65230e4f5790d110e6eb246ed5bbb9a721 Mon Sep 17 00:00:00 2001
From: jsiegle <jsiegle@mit.edu>
Date: Wed, 11 Apr 2012 17:50:35 -0400
Subject: [PATCH] Added Parameter Slider

---
 Source/Processors/Editors/GenericEditor.cpp   | 13 ++-
 Source/Processors/Editors/ParameterEditor.cpp | 95 ++++++++++++++++++-
 Source/Processors/Editors/ParameterEditor.h   | 26 +++++
 Source/Processors/SignalGenerator.cpp         |  8 +-
 4 files changed, 137 insertions(+), 5 deletions(-)

diff --git a/Source/Processors/Editors/GenericEditor.cpp b/Source/Processors/Editors/GenericEditor.cpp
index 496e2ea1e..2bbf74b01 100644
--- a/Source/Processors/Editors/GenericEditor.cpp
+++ b/Source/Processors/Editors/GenericEditor.cpp
@@ -88,11 +88,22 @@ GenericEditor::GenericEditor (GenericProcessor* owner)//, FilterViewport* vp)
 	//grad.addColour(0.5, Colours::lightgrey);
 	//grad.addColour(1.0f, Colours::grey);
 
+	int maxX = 20;
+	int maxY = 30;
+
 	for (int i = 0; i < owner->getNumParameters(); i++)
 	{
 		ParameterEditor* p = new ParameterEditor(owner->getParameterReference(i), titleFont);												
-		p->setBounds(20, 40, 120, 30);
+		
+		int dWidth = p->desiredWidth;
+		int dHeight = p->desiredHeight;
+
+		p->setBounds(maxX, maxY, dWidth, dHeight);
 		addAndMakeVisible(p);
+
+		maxY += dHeight;
+		maxY += 10;
+
 	}
 
 	backgroundColor = Colour(10,10,10);
diff --git a/Source/Processors/Editors/ParameterEditor.cpp b/Source/Processors/Editors/ParameterEditor.cpp
index 7c72d3635..541ab3d36 100644
--- a/Source/Processors/Editors/ParameterEditor.cpp
+++ b/Source/Processors/Editors/ParameterEditor.cpp
@@ -29,6 +29,7 @@ ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
 	if (p.isBoolean())
 	{
 		std::cout << "Boolean parameter. Creating checkbox." << std::endl;
+		
 		// create checkbox
 		ParameterCheckbox* pc = new ParameterCheckbox((bool) p.getDefaultValue());
 		addAndMakeVisible(pc);
@@ -41,11 +42,32 @@ ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
 		label->setBounds(10, 1, 100, 10);
 		addAndMakeVisible(label);
 
+		desiredWidth = 120;
+		desiredHeight = 25;
+
 	} else if (p.isContinuous())
 	{
 		std::cout << "Continuous parameter. Creating slider." << std::endl;
 		// create slider
-		//ParameterSlider* ps = new ParameterSlider(p.getName(), p.getPossibleValues());
+		Array<var> possibleValues = p.getPossibleValues();
+		ParameterSlider* ps = new ParameterSlider((float) possibleValues[0],
+												  (float) possibleValues[1],
+												  (float) p.getDefaultValue(),
+												  labelFont);
+
+		ps->setBounds(0,0, 40, 40);
+		addAndMakeVisible(ps);
+
+		Label* label = new Label(p.getName(), p.getName());
+		labelFont.setHeight(10);
+		int width = labelFont.getStringWidth(p.getName());
+		label->setColour(Label::textColourId, Colours::darkgrey);
+		label->setFont(labelFont);
+		label->setBounds((40-width)/2-5, 40, 100, 10);
+		addAndMakeVisible(label);
+
+		desiredWidth = 50;
+		desiredHeight = 50;
 
 	} else if (p.isDiscrete())
 	{
@@ -85,6 +107,9 @@ ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
 			addAndMakeVisible(pb);
 
 		}
+
+		desiredWidth = 120;
+		desiredHeight = 30;
 	}
 }
 
@@ -243,4 +268,72 @@ void ParameterCheckbox::paintButton(Graphics& g, bool isMouseOver, bool isButton
 	
 	g.fillRoundedRectangle(1, 1, getWidth()-2, getHeight()-2, 2.0f);
 
+}
+
+// ========== PARAMETER SLIDER ====================
+
+ParameterSlider::ParameterSlider(float min, float max, 
+						float def, Font labelFont) : Slider("name"), font(labelFont)
+{
+
+	setSliderStyle(Slider::Rotary);
+	setRange(min,max,1.0f);
+	setValue(def);
+	setTextBoxStyle(Slider::NoTextBox, false, 40, 20);
+
+}
+
+void ParameterSlider::paint(Graphics& g)
+{
+
+	ColourGradient grad = ColourGradient(Colour(40, 40, 40), 0.0f, 0.0f,
+	
+							  Colour(80, 80, 80), 0.0, 40.0f, false);
+
+	Path p;
+	p.addPieSegment(3, 3, getWidth()-6, getHeight()-6, 5*double_Pi/4-0.2, 5*double_Pi/4+3*double_Pi/2+0.2, 0.5);
+
+	g.setGradientFill(grad);
+	g.fillPath(p);
+	//g.fillEllipse(3, 3, getWidth()-6, getHeight()-6);
+
+	//g.setColour(Colours::lightgrey);
+	//g.fillEllipse(12, 12, getWidth()-24, getHeight()-24);
+
+	p = makeRotaryPath(getMinimum(), getMaximum(), getValue());
+	g.setColour(Colour(240,179,12));
+	g.fillPath(p);
+	
+	//g.setColour(Colours::darkgrey);
+	font.setHeight(9.0);
+	g.setFont(font);
+
+
+	String valueString = String( (int) getValue());
+
+	int stringWidth = font.getStringWidth(valueString);
+
+	g.setFont(font);
+
+	g.setColour(Colours::darkgrey);
+	g.drawSingleLineText(valueString, getWidth()/2 - stringWidth/2, getHeight()/2+3);
+
+}
+
+Path ParameterSlider::makeRotaryPath(double min, double max, double val)
+{
+	Path p;
+
+	double start = 5*double_Pi/4;
+
+	double range = (val-min)/(max - min)*1.5*double_Pi + start;
+
+	p.addPieSegment(6,6, getWidth()-12, getHeight()-12, start, range, 0.8);
+
+	// p.startNewSubPath(5, getHeight()-5);
+	// p.addArc(5, 5, getWidth()-10, getWidth()-10, 5/4*double_Pi, range);
+	// //p.addArc(getWidth()-5, getHeight()-5, getWidth()-16, getWidth()-16, 5/4*double_Pi, range);
+	// p.closeSubPath();
+
+	return p;
 }
\ No newline at end of file
diff --git a/Source/Processors/Editors/ParameterEditor.h b/Source/Processors/Editors/ParameterEditor.h
index d364ccee8..729d3a804 100644
--- a/Source/Processors/Editors/ParameterEditor.h
+++ b/Source/Processors/Editors/ParameterEditor.h
@@ -45,6 +45,9 @@ public:
 	ParameterEditor(Parameter& p, Font labelFont);
 	~ParameterEditor();
 
+	
+    int desiredWidth;
+    int desiredHeight;
 
 private:
 
@@ -65,6 +68,7 @@ public:
     ParameterButton(var value, int buttonType, Font labelFont);
     ~ParameterButton() {}
 
+
 private:
     void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown);
     
@@ -83,6 +87,8 @@ private:
     ColourGradient neutralGrad;
     ColourGradient neutralOverGrad;
 
+
+
     enum {
 		LEFT,
 		MIDDLE,
@@ -107,4 +113,24 @@ private:
     ColourGradient neutralOverGrad;
 };
 
+class ParameterSlider : public Slider
+
+{
+public:
+    ParameterSlider(float min, float max, float defaultValue, Font f);
+    ~ParameterSlider() {}
+
+private:
+    void paint(Graphics& g);//Button(Graphics& g, bool isMouseOver, bool isButtonDown);
+    
+    Path makeRotaryPath(double, double, double);
+
+    Font font;
+    // ColourGradient selectedGrad;
+    // ColourGradient selectedOverGrad;
+    // ColourGradient neutralGrad;
+    // ColourGradient neutralOverGrad;
+};
+
+
 #endif  // __PARAMETEREDITOR_H_44537DA9__
diff --git a/Source/Processors/SignalGenerator.cpp b/Source/Processors/SignalGenerator.cpp
index 5fcb29f6e..e8e4a088f 100644
--- a/Source/Processors/SignalGenerator.cpp
+++ b/Source/Processors/SignalGenerator.cpp
@@ -37,16 +37,18 @@ SignalGenerator::SignalGenerator()
 
 	// create parameters, to be passed to the GenericEditor
 
-	//String paramName = String("Bill");
 	Array<var> a;
 	a.add(1);
 	a.add(2);
 	a.add(3);
 
-	Parameter p = Parameter("Parameter name",true);//a,0);
+	//parameters.add(Parameter("SVN",0.0f, 100.0f, 50.0f));
 
-	parameters.add(p);
+	parameters.add(Parameter("Param 1",a, 0));//true);//a,0);
 
+	parameters.add(Parameter("Param 1",a, 0));//true);//a,0);
+
+	parameters.add(Parameter("Param 2",true));
 
 }
 
-- 
GitLab