From 733f60db5acc6c1d7120638b67562a405831f846 Mon Sep 17 00:00:00 2001
From: jsiegle <jsiegle@mit.edu>
Date: Sat, 6 Apr 2013 20:36:29 -0400
Subject: [PATCH] Beautify LFP Viewer

---
 Source/Processors/LfpDisplayNode.cpp          |  24 +--
 .../Visualization/LfpDisplayCanvas.cpp        | 150 ++++++++++++++++--
 .../Visualization/LfpDisplayCanvas.h          |  24 ++-
 3 files changed, 174 insertions(+), 24 deletions(-)

diff --git a/Source/Processors/LfpDisplayNode.cpp b/Source/Processors/LfpDisplayNode.cpp
index a25e21fc3..e56c434f2 100755
--- a/Source/Processors/LfpDisplayNode.cpp
+++ b/Source/Processors/LfpDisplayNode.cpp
@@ -34,21 +34,21 @@ LfpDisplayNode::LfpDisplayNode()
     displayBuffer = new AudioSampleBuffer(8, 100);
     eventBuffer = new MidiBuffer();
 
-    Array<var> timeBaseValues;
-    timeBaseValues.add(1);
-    timeBaseValues.add(2);
-    timeBaseValues.add(5);
-    timeBaseValues.add(10);
+    // Array<var> timeBaseValues;
+    // timeBaseValues.add(1);
+    // timeBaseValues.add(2);
+    // timeBaseValues.add(5);
+    // timeBaseValues.add(10);
 
-    parameters.add(Parameter("timebase",timeBaseValues, 1, 0));//true);//a,0);
+    // parameters.add(Parameter("timebase",timeBaseValues, 1, 0));//true);//a,0);
 
-    Array<var> displayGainValues;
-    displayGainValues.add(1);
-    displayGainValues.add(2);
-    displayGainValues.add(4);
-    displayGainValues.add(8);
+    // Array<var> displayGainValues;
+    // displayGainValues.add(1);
+    // displayGainValues.add(2);
+    // displayGainValues.add(4);
+    // displayGainValues.add(8);
 
-    parameters.add(Parameter("display gain",displayGainValues, 1, 1));//true);//a,0);
+    // parameters.add(Parameter("display gain",displayGainValues, 1, 1));//true);//a,0);
 
     arrayOfOnes = new float[5000];
 
diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.cpp b/Source/Processors/Visualization/LfpDisplayCanvas.cpp
index 6e2487015..a56a32c11 100755
--- a/Source/Processors/Visualization/LfpDisplayCanvas.cpp
+++ b/Source/Processors/Visualization/LfpDisplayCanvas.cpp
@@ -44,6 +44,8 @@ LfpDisplayCanvas::LfpDisplayCanvas(LfpDisplayNode* processor_) :
     lfpDisplay = new LfpDisplay(this, viewport);
     timescale = new LfpTimescale(this);
 
+    timescale->setTimebase(timebase);
+
     viewport->setViewedComponent(lfpDisplay, false);
     viewport->setScrollBarsShown(true, false);
 
@@ -52,6 +54,31 @@ LfpDisplayCanvas::LfpDisplayCanvas(LfpDisplayNode* processor_) :
     addAndMakeVisible(viewport);
     addAndMakeVisible(timescale);
 
+    voltageRanges.add("100");
+    voltageRanges.add("500");
+    voltageRanges.add("1000");
+    voltageRanges.add("2000");
+    voltageRanges.add("5000");
+
+    timebases.add("0.2");
+    timebases.add("0.5");
+    timebases.add("1.0");
+    timebases.add("2.0");
+    timebases.add("5.0");
+    timebases.add("10.0");
+
+    rangeSelection = new ComboBox("Voltage range");
+    rangeSelection->addItemList(voltageRanges, 1);
+    rangeSelection->setSelectedId(3,false);
+    rangeSelection->addListener(this);
+    addAndMakeVisible(rangeSelection);
+
+    timebaseSelection = new ComboBox("Timebase");
+    timebaseSelection->addItemList(timebases, 1);
+    timebaseSelection->setSelectedId(3,false);
+    timebaseSelection->addListener(this);
+    addAndMakeVisible(timebaseSelection);
+
     lfpDisplay->setNumChannels(nChans);
 
 }
@@ -65,13 +92,14 @@ LfpDisplayCanvas::~LfpDisplayCanvas()
 void LfpDisplayCanvas::resized()
 {
 
-
-
     timescale->setBounds(0,0,getWidth()-scrollBarThickness,30);
     viewport->setBounds(0,30,getWidth(),getHeight()-90);
 
     lfpDisplay->setBounds(0,0,getWidth()-scrollBarThickness, lfpDisplay->getTotalHeight());
 
+    rangeSelection->setBounds(100,getHeight()-50,100,25);
+    timebaseSelection->setBounds(300,getHeight()-50,100,25);
+
 }
 
 void LfpDisplayCanvas::beginAnimation()
@@ -109,6 +137,20 @@ void LfpDisplayCanvas::update()
 
 }
 
+void LfpDisplayCanvas::comboBoxChanged(ComboBox* cb)
+{
+
+	if (cb == timebaseSelection)
+	{
+		timebase = timebases[cb->getSelectedId()-1].getFloatValue();
+	} else if (cb == rangeSelection)
+	{
+		displayGain = 150.0f / voltageRanges[cb->getSelectedId()-1].getFloatValue(); // not sure this is right.
+	}
+
+	timescale->setTimebase(timebase);
+}
+
 
 void LfpDisplayCanvas::setParameter(int param, float val)
 {
@@ -261,10 +303,24 @@ void LfpDisplayCanvas::paint(Graphics& g)
 {
 
     //std::cout << "Painting" << std::endl;
-    g.setColour(Colours::grey);
+    g.setColour(Colour(25,25,25));
 
     g.fillRect(0, 0, getWidth(), getHeight());
 
+    g.setColour(Colour(40,40,40));
+    
+    int w = getWidth()-scrollBarThickness;
+
+    for (int i = 1; i < 10; i++)
+    {
+    	if (i == 5)
+    		g.drawLine(w/10*i,0,w/10*i,getHeight()-60,3.0f);
+    	else
+    		g.drawLine(w/10*i,0,w/10*i,getHeight()-60,1.0f);
+    }
+
+    g.drawLine(0,getHeight()-60,getWidth(),getHeight()-60,3.0f);
+
     // g.setColour(Colours::yellow);
 
     // g.drawLine(screenBufferIndex, 0, screenBufferIndex, getHeight());
@@ -286,6 +342,7 @@ void LfpDisplayCanvas::refresh()
 LfpTimescale::LfpTimescale(LfpDisplayCanvas* c) : canvas(c)
 {
 
+	font = Font("Default", 16, Font::plain);
 }
 
 LfpTimescale::~LfpTimescale()
@@ -296,7 +353,46 @@ LfpTimescale::~LfpTimescale()
 void LfpTimescale::paint(Graphics& g)
 {
 
-    g.fillAll(Colours::black);
+	g.setGradientFill(ColourGradient(Colour(50,50,50),0,0, 
+		                             Colour(25,25,25),0,getHeight(),
+		                             false));
+
+    g.fillAll();
+
+     g.setColour(Colours::black);
+
+     g.drawLine(0,getHeight(),getWidth(),getHeight());
+
+    g.setFont(font);
+
+    g.setColour(Colour(100,100,100));
+
+    for (int i = 1; i < 10; i++)
+    {
+    	if (i == 5)
+    		g.drawLine(getWidth()/10*i,0,getWidth()/10*i,getHeight(),3.0f);
+    	else
+    		g.drawLine(getWidth()/10*i,0,getWidth()/10*i,getHeight(),1.0f);
+
+    	g.drawText(labels[i-1],getWidth()/10*i+1,0,100,getHeight(),Justification::left, false);
+    }
+
+}
+
+void LfpTimescale::setTimebase(float t)
+{
+	timebase = t;
+
+	labels.clear();
+
+	for (float i = 1.0f; i < 10.0; i++)
+	{
+		String labelString = String(timebase/10.0f*i);
+
+		labels.add(labelString.substring(1,4));
+	}
+
+	repaint();
 
 }
 
@@ -310,6 +406,17 @@ LfpDisplay::LfpDisplay(LfpDisplayCanvas* c, Viewport* v) :
     totalHeight = 0;
 
     addMouseListener(this, true);
+
+    for (int i = 0; i < 10; i++)
+    {
+    	channelColours.add(Colour(200,200,255-i*25));
+    }
+
+    for (int i = 10; i > -1; i--)
+    {
+    	channelColours.add(Colour(200,200,255-i*25));
+    }
+
 }
 
 LfpDisplay::~LfpDisplay()
@@ -334,6 +441,8 @@ void LfpDisplay::setNumChannels(int numChannels)
 
         LfpChannelDisplay* lfpChan = new LfpChannelDisplay(canvas, i);
 
+        lfpChan->setColour(channelColours[i % channelColours.size()]);
+
         addAndMakeVisible(lfpChan);
 
         channels.add(lfpChan);
@@ -397,7 +506,7 @@ void LfpDisplay::mouseDown(const MouseEvent& event)
     int x = event.getMouseDownX();
     int y = event.getMouseDownY();
 
-    std::cout << "Mouse down at " << x << ", " << y << std::endl;
+    //std::cout << "Mouse down at " << x << ", " << y << std::endl;
 
 
     for (int n = 0; n < numChans; n++)
@@ -421,6 +530,8 @@ LfpChannelDisplay::LfpChannelDisplay(LfpDisplayCanvas* c, int channelNumber) :
 
 	channelFont = Font("Default", 50, Font::plain);
 
+	lineColour = Colour(255,255,255);
+
 }
 
 LfpChannelDisplay::~LfpChannelDisplay()
@@ -431,22 +542,34 @@ LfpChannelDisplay::~LfpChannelDisplay()
 void LfpChannelDisplay::paint(Graphics& g)
 {
 
-	g.fillAll(Colours::grey);
+	//g.fillAll(Colours::grey);
 
 	 g.setColour(Colours::yellow);
 
     g.drawLine(canvas->screenBufferIndex, 0, canvas->screenBufferIndex, getHeight());
 
+    int center = getHeight()/2;
+
     if (isSelected)
-        g.setColour(Colours::lightgrey);
-    else
-        g.setColour(Colours::black);
+    {
+    	g.setColour(Colours::lightgrey);
+    	g.fillRect(0,center-50,10,100);
+    	g.drawLine(0,center+50,getWidth(),center+50);
+    	g.drawLine(0,center-50,getWidth(),center-50);
+
+    	g.setColour(Colour(25,25,25));
+    	g.drawLine(0,center+25,10,center+25);
+    	g.drawLine(0,center-25,10,center-25);
+    	
+    }
 
+    
+     g.setColour(Colour(40,40,40));
     g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);
 
     int stepSize = 1;
 
-   
+    g.setColour(lineColour);
 
     for (int i = 0; i < getWidth()-stepSize; i += stepSize)
     {
@@ -457,7 +580,7 @@ void LfpChannelDisplay::paint(Graphics& g)
                    (canvas->getYCoord(chan, i+stepSize)+0.5f)*getHeight());
     }
 
-    g.setColour(Colours::black.withAlpha(0.3f));
+    g.setColour(lineColour.withAlpha(0.7f));
     g.setFont(channelFont);
 
     g.drawText(String(chan+1), 10, 50, 200, 50, Justification::left, false);
@@ -474,3 +597,8 @@ void LfpChannelDisplay::deselect()
 {
     isSelected = false;
 }
+
+void LfpChannelDisplay::setColour(Colour c)
+{
+	lineColour = c;
+}
diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.h b/Source/Processors/Visualization/LfpDisplayCanvas.h
index 567fe72b8..93335a9f0 100755
--- a/Source/Processors/Visualization/LfpDisplayCanvas.h
+++ b/Source/Processors/Visualization/LfpDisplayCanvas.h
@@ -41,7 +41,8 @@ class LfpChannelDisplay;
 
 */
 
-class LfpDisplayCanvas : public Visualizer
+class LfpDisplayCanvas : public Visualizer,
+						 public ComboBox::Listener
 
 {
 public:
@@ -70,6 +71,8 @@ public:
     int screenBufferIndex;
     int lastScreenBufferIndex;
 
+    void comboBoxChanged(ComboBox* cb);
+
 private:
 
     float sampleRate;
@@ -90,6 +93,12 @@ private:
     ScopedPointer<LfpDisplay> lfpDisplay;
     ScopedPointer<Viewport> viewport;
 
+    ScopedPointer<ComboBox> timebaseSelection;
+    ScopedPointer<ComboBox> rangeSelection;
+
+    StringArray voltageRanges;
+    StringArray timebases;
+
     void refreshScreenBuffer();
     void updateScreenBuffer();
 
@@ -112,10 +121,18 @@ public:
 
     void paint(Graphics& g);
 
+    void setTimebase(float t);
+
 private:
 
     LfpDisplayCanvas* canvas;
 
+    float timebase;
+
+    Font font;
+
+    StringArray labels;
+
 };
 
 class LfpDisplay : public Component
@@ -147,6 +164,7 @@ private:
     Viewport* viewport;
 
     Array<LfpChannelDisplay*> channels;
+    Array<Colour> channelColours;
 
 };
 
@@ -161,6 +179,8 @@ public:
     void select();
     void deselect();
 
+    void setColour(Colour c);
+
 
 private:
 
@@ -172,6 +192,8 @@ private:
 
     Font channelFont;
 
+    Colour lineColour;
+
 };
 
 
-- 
GitLab