Move waterfall color themes to general theme classes, convert hard-coded colors

This commit is contained in:
Charles J. Cliffe
2015-01-14 22:14:57 -05:00
parent 1afcd9ff3b
commit 4213b47c99
17 changed files with 422 additions and 207 deletions
+212
View File
@@ -0,0 +1,212 @@
#include "ColorTheme.h"
#include "CubicSDR.h"
#include "CubicSDRDefs.h"
ThemeMgr ThemeMgr::mgr;
void ThemeMgr::setTheme(int themeId) {
currentTheme = themes[themeId];
this->themeId = themeId;
}
int ThemeMgr::getTheme() {
return themeId;
}
ThemeMgr::ThemeMgr() {
themes[COLOR_THEME_DEFAULT] = new DefaultColorTheme;
themes[COLOR_THEME_BW] = new BlackAndWhiteColorTheme;
themes[COLOR_THEME_SHARP] = new SharpColorTheme;
themes[COLOR_THEME_RAD] = new RadColorTheme;
themes[COLOR_THEME_TOUCH] = new TouchColorTheme;
themes[COLOR_THEME_HD] = new HDColorTheme;
themes[COLOR_THEME_RADAR] = new RadarColorTheme;
currentTheme = themes[COLOR_THEME_DEFAULT];
themeId = COLOR_THEME_DEFAULT;
}
ThemeMgr::~ThemeMgr() {
std::map<int, ColorTheme *>::iterator i;
for (i = themes.begin(); i != themes.end(); i++) {
delete i->second;
}
}
DefaultColorTheme::DefaultColorTheme() {
name = "Default";
waterfallGradient.addColor(GradientColor(0, 0, 0));
waterfallGradient.addColor(GradientColor(0, 0, 1.0));
waterfallGradient.addColor(GradientColor(0, 1.0, 0));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 0));
waterfallGradient.addColor(GradientColor(1.0, 0.2, 0.0));
waterfallGradient.generate(256);
waterfallHighlight = RGBColor(1, 1, 1);
waterfallNew = RGBColor(0, 1, 0);
waterfallHover = RGBColor(1, 1, 0);
waterfallDestroy = RGBColor(1, 0, 0);
fftLine = RGBColor(0.9, 0.9, 0.9);
fftHighlight = RGBColor(1, 1, 1);
scopeLine = RGBColor(0.9, 0.9, 0.9);
tuningBar = RGBColor(0.2, 0.2, 0.9);
meterLevel = RGBColor(0.1, 0.75, 0.1);
meterValue = RGBColor(0.75, 0.1, 0.1);
text = RGBColor(1, 1, 1);
freqLine = RGBColor(1, 1, 1);
button = RGBColor(0.65, 0.65, 0.65);
buttonHighlight = RGBColor(1, 1, 0);
}
BlackAndWhiteColorTheme::BlackAndWhiteColorTheme() {
name = "Black & White";
waterfallGradient.addColor(GradientColor(0, 0, 0));
waterfallGradient.addColor(GradientColor(0.75, 0.75, 0.75));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0));
waterfallGradient.generate(256);
waterfallHighlight = RGBColor(1, 1, 1);
waterfallNew = RGBColor(0, 1, 0);
waterfallHover = RGBColor(1, 1, 0);
waterfallDestroy = RGBColor(1, 0, 0);
fftLine = RGBColor(0.9, 0.9, 0.9);
fftHighlight = RGBColor(1, 1, 1);
scopeLine = RGBColor(0.9, 0.9, 0.9);
tuningBar = RGBColor(0.2, 0.2, 0.9);
meterLevel = RGBColor(0, 1, 0);
meterValue = RGBColor(1, 0, 0);
text = RGBColor(1, 1, 1);
freqLine = RGBColor(1, 1, 1);
button = RGBColor(0.65, 0.65, 0.65);
buttonHighlight = RGBColor(1, 1, 0);
}
SharpColorTheme::SharpColorTheme() {
name = "Sharp";
waterfallGradient.addColor(GradientColor(0, 0, 0));
waterfallGradient.addColor(GradientColor(0.0, 0, 0.5));
waterfallGradient.addColor(GradientColor(0.0, 0.0, 1.0));
waterfallGradient.addColor(GradientColor(65.0 / 255.0, 161.0 / 255.0, 1.0));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 0.5));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 0.0));
waterfallGradient.addColor(GradientColor(1.0, 0.5, 0.0));
waterfallGradient.addColor(GradientColor(1.0, 0.25, 0.0));
waterfallGradient.addColor(GradientColor(0.5, 0.1, 0.0));
waterfallGradient.generate(256);
waterfallHighlight = RGBColor(1, 1, 1);
waterfallNew = RGBColor(0, 1, 0);
waterfallHover = RGBColor(1, 1, 0);
waterfallDestroy = RGBColor(1, 0, 0);
fftLine = RGBColor(0.9, 0.9, 0.9);
fftHighlight = RGBColor(1, 1, 1);
scopeLine = RGBColor(0.9, 0.9, 0.9);
tuningBar = RGBColor(0.2, 0.2, 0.9);
meterLevel = RGBColor(0, 1, 0);
meterValue = RGBColor(1, 0, 0);
text = RGBColor(1, 1, 1);
freqLine = RGBColor(1, 1, 1);
button = RGBColor(0.65, 0.65, 0.65);
buttonHighlight = RGBColor(1, 1, 0);
}
RadColorTheme::RadColorTheme() {
name = "Rad";
waterfallGradient.addColor(GradientColor(0, 0, 0.5));
waterfallGradient.addColor(GradientColor(25.0 / 255.0, 154.0 / 255.0, 0.0));
waterfallGradient.addColor(GradientColor(201.0 / 255.0, 115.0 / 255.0, 0.0));
waterfallGradient.addColor(GradientColor(1.0, 40.0 / 255.0, 40.0 / 255.0));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0));
waterfallGradient.generate(256);
waterfallHighlight = RGBColor(1, 1, 1);
waterfallNew = RGBColor(0, 1, 0);
waterfallHover = RGBColor(1, 1, 0);
waterfallDestroy = RGBColor(1, 0, 0);
fftLine = RGBColor(0.9, 0.9, 0.9);
fftHighlight = RGBColor(1, 1, 1);
scopeLine = RGBColor(0.9, 0.9, 0.9);
tuningBar = RGBColor(0.2, 0.2, 0.9);
meterLevel = RGBColor(0, 1, 0);
meterValue = RGBColor(1, 0, 0);
text = RGBColor(1, 1, 1);
freqLine = RGBColor(1, 1, 1);
button = RGBColor(0.65, 0.65, 0.65);
buttonHighlight = RGBColor(1, 1, 0);
}
TouchColorTheme::TouchColorTheme() {
name = "Touch";
waterfallGradient.addColor(GradientColor(0, 0, 0));
waterfallGradient.addColor(GradientColor(55.0 / 255.0, 40.0 / 255.0, 55.0 / 255.0));
waterfallGradient.addColor(GradientColor(60.0 / 255.0, 60.0 / 255.0, 90.0 / 255.0));
waterfallGradient.addColor(GradientColor(0.0 / 255.0, 255.0 / 255.0, 255.0 / 255.0));
waterfallGradient.addColor(GradientColor(10.0 / 255.0, 255.0 / 255.0, 85.0 / 255.0));
waterfallGradient.addColor(GradientColor(255.0 / 255.0, 255.0 / 255.0, 75.0 / 255.0));
waterfallGradient.addColor(GradientColor(255.0 / 255.0, 0.0 / 255.0, 0.0 / 255.0));
waterfallGradient.addColor(GradientColor(255.0 / 255.0, 255.0 / 255.0, 255.0 / 255.0));
waterfallGradient.generate(256);
waterfallHighlight = RGBColor(1, 1, 1);
waterfallNew = RGBColor(0, 1, 0);
waterfallHover = RGBColor(1, 1, 0);
waterfallDestroy = RGBColor(1, 0, 0);
fftLine = RGBColor(0.9, 0.9, 0.9);
fftHighlight = RGBColor(1, 1, 1);
scopeLine = RGBColor(0.9, 0.9, 0.9);
tuningBar = RGBColor(0.2, 0.2, 0.9);
meterLevel = RGBColor(0, 1, 0);
meterValue = RGBColor(1, 0, 0);
text = RGBColor(1, 1, 1);
freqLine = RGBColor(1, 1, 1);
button = RGBColor(0.65, 0.65, 0.65);
buttonHighlight = RGBColor(1, 1, 0);
}
HDColorTheme::HDColorTheme() {
name = "HD";
waterfallGradient.addColor(GradientColor(5.0 / 255.0, 5.0 / 255.0, 60.0 / 255.0));
waterfallGradient.addColor(GradientColor(5.0 / 255.0, 20.0 / 255.0, 120.0 / 255.0));
waterfallGradient.addColor(GradientColor(50.0 / 255.0, 100.0 / 255.0, 200.0 / 255.0));
waterfallGradient.addColor(GradientColor(75.0 / 255.0, 190.0 / 255.0, 100.0 / 255.0));
waterfallGradient.addColor(GradientColor(240.0 / 255.0, 55.0 / 255.0, 5.0 / 255.0));
waterfallGradient.addColor(GradientColor(255.0 / 255.0, 55.0 / 255.0, 100.0 / 255.0));
waterfallGradient.addColor(GradientColor(255.0 / 255.0, 235.0 / 255.0, 100.0 / 255.0));
waterfallGradient.addColor(GradientColor(250.0 / 255.0, 250.0 / 255.0, 250.0 / 255.0));
waterfallGradient.generate(256);
waterfallHighlight = RGBColor(1, 1, 1);
waterfallNew = RGBColor(0, 1, 0);
waterfallHover = RGBColor(1, 1, 0);
waterfallDestroy = RGBColor(1, 0, 0);
fftLine = RGBColor(0.9, 0.9, 0.9);
fftHighlight = RGBColor(1, 1, 1);
scopeLine = RGBColor(0.9, 0.9, 0.9);
tuningBar = RGBColor(0.2, 0.2, 0.9);
meterLevel = RGBColor(0, 1, 0);
meterValue = RGBColor(1, 0, 0);
text = RGBColor(1, 1, 1);
freqLine = RGBColor(1, 1, 1);
button = RGBColor(0.65, 0.65, 0.65);
buttonHighlight = RGBColor(1, 1, 0);
}
RadarColorTheme::RadarColorTheme() {
name = "Rad";
waterfallGradient.addColor(GradientColor(5.0 / 255.0, 45.0 / 255.0, 10.0 / 255.0));
waterfallGradient.addColor(GradientColor(30.0 / 255.0, 150.0 / 255.0, 40.0 / 255.0));
waterfallGradient.addColor(GradientColor(40.0 / 255.0, 240.0 / 255.0, 60.0 / 255.0));
waterfallGradient.addColor(GradientColor(250.0 / 255.0, 250.0 / 255.0, 250.0 / 255.0));
waterfallGradient.generate(256);
waterfallHighlight = RGBColor(1, 1, 1);
waterfallNew = RGBColor(0, 1, 0);
waterfallHover = RGBColor(1, 1, 0);
waterfallDestroy = RGBColor(1, 0, 0);
fftLine = RGBColor(0.9, 0.9, 0.9);
fftHighlight = RGBColor(1, 1, 1);
scopeLine = RGBColor(0.9, 0.9, 0.9);
tuningBar = RGBColor(0.2, 0.2, 0.9);
meterLevel = RGBColor(0, 1, 0);
meterValue = RGBColor(1, 0, 0);
text = RGBColor(1, 1, 1);
freqLine = RGBColor(1, 1, 1);
button = RGBColor(0.65, 0.65, 0.65);
buttonHighlight = RGBColor(1, 1, 0);
}
+110
View File
@@ -0,0 +1,110 @@
#pragma once
#include "Gradient.h"
#include <map>
#include <vector>
#include <string>
#define COLOR_THEME_DEFAULT 0
#define COLOR_THEME_BW 1
#define COLOR_THEME_SHARP 2
#define COLOR_THEME_RAD 3
#define COLOR_THEME_TOUCH 4
#define COLOR_THEME_HD 5
#define COLOR_THEME_RADAR 6
#define COLOR_THEME_MAX 7
class RGBColor {
public:
float r, g, b;
RGBColor(float r, float g, float b) :
r(r), g(g), b(b) {
}
RGBColor() :
RGBColor(0, 0, 0) {
}
~RGBColor() {
}
RGBColor & operator=(const RGBColor &other) {
r = other.r;
g = other.g;
b = other.b;
return *this;
}
};
class ColorTheme {
public:
RGBColor waterfallHighlight;
RGBColor waterfallNew;
RGBColor wfHighlight;
RGBColor waterfallHover;
RGBColor waterfallDestroy;
RGBColor fftLine;
RGBColor fftHighlight;
RGBColor scopeLine;
RGBColor tuningBar;
RGBColor meterLevel;
RGBColor meterValue;
RGBColor text;
RGBColor freqLine;
RGBColor button;
RGBColor buttonHighlight;
Gradient waterfallGradient;
std::string name;
};
class ThemeMgr {
public:
ThemeMgr();
~ThemeMgr();
ColorTheme *currentTheme;
std::map<int, ColorTheme *> themes;
void setTheme(int themeId);
int getTheme();
int themeId;
static ThemeMgr mgr;
};
class DefaultColorTheme: public ColorTheme {
public:
DefaultColorTheme();
};
class BlackAndWhiteColorTheme: public ColorTheme {
public:
BlackAndWhiteColorTheme();
};
class SharpColorTheme: public ColorTheme {
public:
SharpColorTheme();
};
class RadColorTheme: public ColorTheme {
public:
RadColorTheme();
};
class TouchColorTheme: public ColorTheme {
public:
TouchColorTheme();
};
class HDColorTheme: public ColorTheme {
public:
HDColorTheme();
};
class RadarColorTheme: public ColorTheme {
public:
RadarColorTheme();
};
+2 -5
View File
@@ -69,11 +69,8 @@ void MeterCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
if (mouseTracker.mouseInView()) {
glContext->Draw(0.4, 0.4, 0.4, 0.5, mouseTracker.getMouseY());
}
glContext->Draw(0.1, 0.75, 0.1, 0.5, level / level_max);
glContext->Draw(0.75, 0.1, 0.1, 0.5, userInputValue / level_max);
glContext->Draw(ThemeMgr::mgr.currentTheme->meterLevel.r, ThemeMgr::mgr.currentTheme->meterLevel.g, ThemeMgr::mgr.currentTheme->meterLevel.b, 0.5, level / level_max);
glContext->Draw(ThemeMgr::mgr.currentTheme->meterValue.r, ThemeMgr::mgr.currentTheme->meterValue.g, ThemeMgr::mgr.currentTheme->meterValue.b, 0.5, userInputValue / level_max);
glContext->DrawEnd();
SwapBuffers();
+5 -1
View File
@@ -64,7 +64,11 @@ void ModeSelectorCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
int yval = getHoveredSelection();
for (int i = 0; i < numChoices; i++) {
glContext->DrawSelector(selections[i].label, i, numChoices, i == currentSelection || yval == i, (yval == i)?0.9:0.75, (yval == i)?0.9:0.75, (yval == i)?0.2:0.75, 1.0);
if (yval == i) {
glContext->DrawSelector(selections[i].label, i, numChoices, true, ThemeMgr::mgr.currentTheme->buttonHighlight.r, ThemeMgr::mgr.currentTheme->buttonHighlight.g, ThemeMgr::mgr.currentTheme->buttonHighlight.b, 1.0);
} else {
glContext->DrawSelector(selections[i].label, i, numChoices, i == currentSelection, ThemeMgr::mgr.currentTheme->button.r, ThemeMgr::mgr.currentTheme->button.g, ThemeMgr::mgr.currentTheme->button.b, 1.0);
}
}
glContext->DrawEnd();
+3 -2
View File
@@ -1,6 +1,7 @@
#include "ScopeContext.h"
#include "ScopeCanvas.h"
#include "ColorTheme.h"
ScopeContext::ScopeContext(ScopeCanvas *canvas, wxGLContext *sharedContext) :
PrimaryGLContext(canvas, sharedContext) {
@@ -24,7 +25,7 @@ void ScopeContext::Plot(std::vector<float> &points, bool stereo) {
glColor3f(1.0, 1.0, 1.0);
if (stereo) {
glColor3f(0.7, 0.7, 0.7);
glColor3f(ThemeMgr::mgr.currentTheme->scopeLine.r, ThemeMgr::mgr.currentTheme->scopeLine.g, ThemeMgr::mgr.currentTheme->scopeLine.b);
glBegin(GL_LINES);
glVertex2f(-1.0, 0.0);
glVertex2f(1.0, 0.0);
@@ -44,7 +45,7 @@ void ScopeContext::Plot(std::vector<float> &points, bool stereo) {
glEnd();
}
glColor3f(0.9, 0.9, 0.9);
glColor3f(ThemeMgr::mgr.currentTheme->scopeLine.r, ThemeMgr::mgr.currentTheme->scopeLine.g, ThemeMgr::mgr.currentTheme->scopeLine.b);
if (points.size()) {
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, &points[0]);
+1 -1
View File
@@ -78,7 +78,7 @@ void SpectrumCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
std::vector<DemodulatorInstance *> &demods = wxGetApp().getDemodMgr().getDemodulators();
for (int i = 0, iMax = demods.size(); i < iMax; i++) {
glContext->DrawDemodInfo(demods[i], 1, 1, 1, getCenterFrequency(), getBandwidth());
glContext->DrawDemodInfo(demods[i], ThemeMgr::mgr.currentTheme->fftHighlight.r, ThemeMgr::mgr.currentTheme->fftHighlight.g, ThemeMgr::mgr.currentTheme->fftHighlight.b, getCenterFrequency(), getBandwidth());
}
glContext->EndDraw();
+7 -5
View File
@@ -4,6 +4,7 @@
#include "CubicSDR.h"
#include <sstream>
#include <iostream>
#include "ColorTheme.h"
SpectrumContext::SpectrumContext(SpectrumCanvas *canvas, wxGLContext *sharedContext) :
PrimaryGLContext(canvas, sharedContext), fft_size(0) {
@@ -18,7 +19,7 @@ SpectrumContext::SpectrumContext(SpectrumCanvas *canvas, wxGLContext *sharedCont
void SpectrumContext::Draw(std::vector<float> &points, long long freq, int bandwidth) {
glDisable(GL_TEXTURE_2D);
glColor3f(1.0, 1.0, 1.0);
glColor3f(ThemeMgr::mgr.currentTheme->fftLine.r, ThemeMgr::mgr.currentTheme->fftLine.g, ThemeMgr::mgr.currentTheme->fftLine.b);
if (points.size()) {
glPushMatrix();
@@ -41,8 +42,8 @@ void SpectrumContext::Draw(std::vector<float> &points, long long freq, int bandw
long long rightFreq = leftFreq + (float) bandwidth;
long long firstMhz = (leftFreq / 1000000) * 1000000;
long double mhzStart = ((long double)(firstMhz - leftFreq) / (long double)(rightFreq - leftFreq)) * 2.0;
long double mhzStep = (100000.0 / (long double)(rightFreq - leftFreq)) * 2.0;
long double mhzStart = ((long double) (firstMhz - leftFreq) / (long double) (rightFreq - leftFreq)) * 2.0;
long double mhzStep = (100000.0 / (long double) (rightFreq - leftFreq)) * 2.0;
long double currentMhz = trunc(floor(firstMhz / 1000000.0));
@@ -61,10 +62,11 @@ void SpectrumContext::Draw(std::vector<float> &points, long long freq, int bandw
if (fractpart < 0.001) {
glLineWidth(4.0);
glColor3f(1.0, 1.0, 1.0);
glColor3f(ThemeMgr::mgr.currentTheme->freqLine.r, ThemeMgr::mgr.currentTheme->freqLine.g, ThemeMgr::mgr.currentTheme->freqLine.b);
} else {
glLineWidth(1.0);
glColor3f(0.55, 0.55, 0.55);
glColor3f(ThemeMgr::mgr.currentTheme->freqLine.r * 0.65, ThemeMgr::mgr.currentTheme->freqLine.g * 0.65,
ThemeMgr::mgr.currentTheme->freqLine.b * 0.65);
}
glDisable(GL_TEXTURE_2D);
+24 -18
View File
@@ -25,7 +25,7 @@ EVT_ENTER_WINDOW(TuningCanvas::OnMouseEnterWindow)
wxEND_EVENT_TABLE()
TuningCanvas::TuningCanvas(wxWindow *parent, int *attribList) :
InteractiveCanvas(parent, attribList), dragAccum(0) {
InteractiveCanvas(parent, attribList), dragAccum(0) {
glContext = new TuningContext(this, &wxGetApp().GetContext(this));
}
@@ -52,7 +52,8 @@ void TuningCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
}
if (mouseTracker.mouseDown()) {
glContext->Draw(0.2, 0.2, 0.9, 0.6, mouseTracker.getOriginMouseX(), mouseTracker.getMouseX());
glContext->Draw(ThemeMgr::mgr.currentTheme->tuningBar.r, ThemeMgr::mgr.currentTheme->tuningBar.g, ThemeMgr::mgr.currentTheme->tuningBar.b,
0.6, mouseTracker.getOriginMouseX(), mouseTracker.getMouseX());
}
glContext->DrawEnd();
@@ -64,23 +65,28 @@ void TuningCanvas::OnIdle(wxIdleEvent &event) {
if (mouseTracker.mouseDown()) {
DemodulatorInstance *activeDemod = wxGetApp().getDemodMgr().getLastActiveDemodulator();
dragAccum += mouseTracker.getMouseX() - mouseTracker.getOriginMouseX();
float dragDelta = mouseTracker.getMouseX() - mouseTracker.getOriginMouseX();
dragAccum += dragDelta;
float moveVal = dragAccum * 10.0;
if (uxDown > 0.275) {
wxGetApp().setFrequency(wxGetApp().getFrequency() + (int) (mouseTracker.getOriginDeltaMouseX() * (float)wxGetApp().getSampleRate() * 15.0));
wxGetApp().setFrequency(
wxGetApp().getFrequency()
+ (int) (dragAccum * fabs(dragAccum * 10.0) * fabs(dragAccum * 10.0) * (float) wxGetApp().getSampleRate()));
} else if (fabs(moveVal) >= 1.0) {
if (uxDown < -0.275 && activeDemod != NULL) {
activeDemod->setFrequency(activeDemod->getFrequency() + (int) (moveVal * fabs(moveVal) * fabs(moveVal) * fabs(moveVal)));
} else if (activeDemod != NULL) {
activeDemod->setBandwidth(activeDemod->getBandwidth() + (int) (moveVal * fabs(moveVal) * fabs(moveVal) * fabs(moveVal)));
}
}
if (abs(dragAccum * 10.0) >= 1) {
if (uxDown < -0.275 && activeDemod != NULL) {
activeDemod->setFrequency(activeDemod->getFrequency() + (int) (dragAccum * 10.0));
} else if (activeDemod != NULL) {
activeDemod->setBandwidth(activeDemod->getBandwidth() + (int) (dragAccum * 10.0));
}
while (dragAccum * 10.0 >= 1.0) {
while (fabs(dragAccum * 10.0) >= 1.0) {
if (dragAccum > 0) {
dragAccum -= 1.0 / 10.0;
}
while (dragAccum * -10.0 <= -1.0) {
} else {
dragAccum += 1.0 / 10.0;
}
}
@@ -100,7 +106,7 @@ void TuningCanvas::OnMouseDown(wxMouseEvent& event) {
uxDown = 2.0 * (mouseTracker.getMouseX() - 0.5);
dragAccum = 0;
SetCursor (wxCURSOR_IBEAM);
SetCursor(wxCURSOR_IBEAM);
}
void TuningCanvas::OnMouseWheelMoved(wxMouseEvent& event) {
@@ -110,17 +116,17 @@ void TuningCanvas::OnMouseWheelMoved(wxMouseEvent& event) {
void TuningCanvas::OnMouseReleased(wxMouseEvent& event) {
InteractiveCanvas::OnMouseReleased(event);
mouseTracker.setVertDragLock(false);
SetCursor (wxCURSOR_SIZEWE);
SetCursor(wxCURSOR_SIZEWE);
}
void TuningCanvas::OnMouseLeftWindow(wxMouseEvent& event) {
InteractiveCanvas::OnMouseLeftWindow(event);
SetCursor (wxCURSOR_CROSS);
SetCursor(wxCURSOR_CROSS);
}
void TuningCanvas::OnMouseEnterWindow(wxMouseEvent& event) {
InteractiveCanvas::mouseTracker.OnMouseEnterWindow(event);
SetCursor (wxCURSOR_SIZEWE);
SetCursor(wxCURSOR_SIZEWE);
}
void TuningCanvas::setHelpTip(std::string tip) {
+3 -1
View File
@@ -1,6 +1,8 @@
#include "TuningContext.h"
#include "TuningCanvas.h"
#include "ColorTheme.h"
// http://stackoverflow.com/questions/7276826/c-format-number-with-commas
class comma_numpunct: public std::numpunct<char> {
protected:
@@ -69,7 +71,7 @@ void TuningContext::DrawDemodFreqBw(long long freq, unsigned int bw, long long c
fontHeight = 12;
}
glColor3f(0.85, 0.85, 0.85);
glColor3f(ThemeMgr::mgr.currentTheme->text.r, ThemeMgr::mgr.currentTheme->text.g, ThemeMgr::mgr.currentTheme->text.b);
getFont(fontSize).drawString("Freq: ", -0.75, 0, fontHeight, GLFont::GLFONT_ALIGN_RIGHT, GLFont::GLFONT_ALIGN_CENTER);
if (bw) {
+19 -32
View File
@@ -36,7 +36,7 @@ wxEND_EVENT_TABLE()
WaterfallCanvas::WaterfallCanvas(wxWindow *parent, int *attribList) :
InteractiveCanvas(parent, attribList), spectrumCanvas(NULL), dragState(WF_DRAG_NONE), nextDragState(WF_DRAG_NONE), fft_size(0), waterfall_lines(
0), plan(
NULL), in(NULL), out(NULL), resampler(NULL), resamplerRatio(0), lastInputBandwidth(0), zoom(1), mouseZoom(1), theme(0) {
NULL), in(NULL), out(NULL), resampler(NULL), resamplerRatio(0), lastInputBandwidth(0), zoom(1), mouseZoom(1) {
glContext = new WaterfallContext(this, &wxGetApp().GetContext(this));
@@ -95,11 +95,6 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
glContext->SetCurrent(*this);
glViewport(0, 0, ClientSize.x, ClientSize.y);
if (theme != glContext->getTheme()) {
glContext->setTheme(theme);
theme = glContext->getTheme();
}
glContext->BeginDraw();
glContext->Draw(spectrum_points);
@@ -121,49 +116,49 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
float centerPos = mouseTracker.getOriginMouseX() + width / 2.0;
if (isNew) {
glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(centerPos, 0, 1, 0, width ? width : (1.0 / (float) ClientSize.x), currentCenterFreq,
glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(centerPos, ThemeMgr::mgr.currentTheme->waterfallNew.r, ThemeMgr::mgr.currentTheme->waterfallNew.g, ThemeMgr::mgr.currentTheme->waterfallNew.b, width ? width : (1.0 / (float) ClientSize.x), currentCenterFreq,
currentBandwidth);
} else {
glContext->DrawDemod(lastActiveDemodulator, 1, 0, 0, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(centerPos, 1, 1, 0, width ? width : (1.0 / (float) ClientSize.x), currentCenterFreq,
glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallDestroy.r, ThemeMgr::mgr.currentTheme->waterfallDestroy.g, ThemeMgr::mgr.currentTheme->waterfallDestroy.b, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(centerPos, ThemeMgr::mgr.currentTheme->waterfallHover.r, ThemeMgr::mgr.currentTheme->waterfallHover.g, ThemeMgr::mgr.currentTheme->waterfallHover.b, width ? width : (1.0 / (float) ClientSize.x), currentCenterFreq,
currentBandwidth);
}
} else {
if (isNew) {
glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), 0, 1, 0, 1.0 / (float) ClientSize.x, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallNew.r, ThemeMgr::mgr.currentTheme->waterfallNew.g, ThemeMgr::mgr.currentTheme->waterfallNew.b, 1.0 / (float) ClientSize.x, currentCenterFreq, currentBandwidth);
} else {
glContext->DrawDemod(lastActiveDemodulator, 1, 0, 0, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), 1, 1, 0, 1.0 / (float) ClientSize.x, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(lastActiveDemodulator,ThemeMgr::mgr.currentTheme->waterfallDestroy.r, ThemeMgr::mgr.currentTheme->waterfallDestroy.g, ThemeMgr::mgr.currentTheme->waterfallDestroy.b, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallHover.r, ThemeMgr::mgr.currentTheme->waterfallHover.g, ThemeMgr::mgr.currentTheme->waterfallHover.b, 1.0 / (float) ClientSize.x, currentCenterFreq, currentBandwidth);
}
}
} else {
if (activeDemodulator == NULL) {
if (lastActiveDemodulator) {
if (isNew) {
glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), 0, 1, 0, 0, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallNew.r, ThemeMgr::mgr.currentTheme->waterfallNew.g, ThemeMgr::mgr.currentTheme->waterfallNew.b, 0, currentCenterFreq, currentBandwidth);
} else {
glContext->DrawDemod(lastActiveDemodulator, 1, 0, 0, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), 1, 1, 0, 0, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallDestroy.r, ThemeMgr::mgr.currentTheme->waterfallDestroy.g, ThemeMgr::mgr.currentTheme->waterfallDestroy.b, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallHover.r, ThemeMgr::mgr.currentTheme->waterfallHover.g, ThemeMgr::mgr.currentTheme->waterfallHover.b, 0, currentCenterFreq, currentBandwidth);
}
} else {
glContext->DrawFreqSelector(mouseTracker.getMouseX(), 1, 1, 0, 0, currentCenterFreq, currentBandwidth);
glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallNew.r, ThemeMgr::mgr.currentTheme->waterfallNew.g, ThemeMgr::mgr.currentTheme->waterfallNew.b, 0, currentCenterFreq, currentBandwidth);
}
} else {
if (lastActiveDemodulator) {
glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth);
}
glContext->DrawDemod(activeDemodulator, 1, 1, 0, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(activeDemodulator, ThemeMgr::mgr.currentTheme->waterfallHover.r, ThemeMgr::mgr.currentTheme->waterfallHover.g, ThemeMgr::mgr.currentTheme->waterfallHover.b, currentCenterFreq, currentBandwidth);
}
}
} else {
if (activeDemodulator) {
glContext->DrawDemod(activeDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(activeDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth);
}
if (lastActiveDemodulator) {
glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth);
}
}
@@ -171,7 +166,7 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
if (activeDemodulator == demods[i] || lastActiveDemodulator == demods[i]) {
continue;
}
glContext->DrawDemod(demods[i], 1, 1, 1, currentCenterFreq, currentBandwidth);
glContext->DrawDemod(demods[i], ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth);
}
glContext->EndDraw();
@@ -829,11 +824,3 @@ void WaterfallCanvas::OnMouseRightReleased(wxMouseEvent& event) {
mouseTracker.setHorizDragLock(false);
mouseZoom = 1.0;
}
void WaterfallCanvas::setTheme(int theme_id) {
theme = theme_id;
}
int WaterfallCanvas::getTheme() {
return glContext->getTheme();
}
-4
View File
@@ -29,8 +29,6 @@ public:
DragState getNextDragState();
void attachSpectrumCanvas(SpectrumCanvas *canvas_in);
void setTheme(int theme_id);
int getTheme();
private:
void OnPaint(wxPaintEvent& event);
@@ -77,8 +75,6 @@ private:
int lastInputBandwidth;
float mouseZoom, zoom;
int theme;
std::vector<liquid_float_complex> shiftBuffer;
std::vector<liquid_float_complex> resampleBuffer;
// event table
+10 -99
View File
@@ -3,83 +3,7 @@
#include "CubicSDR.h"
WaterfallContext::WaterfallContext(WaterfallCanvas *canvas, wxGLContext *sharedContext) :
PrimaryGLContext(canvas, sharedContext), waterfall(0), waterfall_tex(NULL), waterfall_lines(0), fft_size(0), theme(COLOR_THEME_DEFAULT) {
Gradient *grad = new Gradient();
grad->addColor(GradientColor(0, 0, 0));
grad->addColor(GradientColor(0, 0, 1.0));
grad->addColor(GradientColor(0, 1.0, 0));
grad->addColor(GradientColor(1.0, 1.0, 0));
grad->addColor(GradientColor(1.0, 0.2, 0.0));
grad->generate(256);
gradients[COLOR_THEME_DEFAULT] = grad;
grad = new Gradient();
grad->addColor(GradientColor(0, 0, 0));
grad->addColor(GradientColor(0.0, 0, 0.5));
grad->addColor(GradientColor(0.0, 0.0, 1.0));
grad->addColor(GradientColor(65.0 / 255.0, 161.0 / 255.0, 1.0));
grad->addColor(GradientColor(1.0, 1.0, 1.0));
grad->addColor(GradientColor(1.0, 1.0, 1.0));
grad->addColor(GradientColor(1.0, 1.0, 0.5));
grad->addColor(GradientColor(1.0, 1.0, 0.0));
grad->addColor(GradientColor(1.0, 0.5, 0.0));
grad->addColor(GradientColor(1.0, 0.25, 0.0));
grad->addColor(GradientColor(0.5, 0.1, 0.0));
grad->generate(256);
gradients[COLOR_THEME_SHARP] = grad;
grad = new Gradient();
grad->addColor(GradientColor(0, 0, 0));
grad->addColor(GradientColor(0.75, 0.75, 0.75));
grad->addColor(GradientColor(1.0, 1.0, 1.0));
grad->generate(256);
gradients[COLOR_THEME_BW] = grad;
grad = new Gradient();
grad->addColor(GradientColor(0, 0, 0.5));
grad->addColor(GradientColor(25.0/255.0, 154.0/255.0, 0.0));
grad->addColor(GradientColor(201.0/255.0, 115.0/255.0, 0.0));
grad->addColor(GradientColor(1.0, 40.0/255.0, 40.0/255.0));
grad->addColor(GradientColor(1.0, 1.0, 1.0));
grad->generate(256);
gradients[COLOR_THEME_RAD] = grad;
grad = new Gradient();
grad->addColor(GradientColor(0, 0, 0));
grad->addColor(GradientColor(55.0/255.0, 40.0/255.0, 55.0/255.0));
grad->addColor(GradientColor(60.0/255.0, 60.0/255.0, 90.0/255.0));
grad->addColor(GradientColor(0.0/255.0, 255.0/255.0, 255.0/255.0));
grad->addColor(GradientColor(10.0/255.0, 255.0/255.0, 85.0/255.0));
grad->addColor(GradientColor(255.0/255.0, 255.0/255.0, 75.0/255.0));
grad->addColor(GradientColor(255.0/255.0, 0.0/255.0, 0.0/255.0));
grad->addColor(GradientColor(255.0/255.0, 255.0/255.0, 255.0/255.0));
grad->generate(256);
gradients[COLOR_THEME_TOUCH] = grad;
grad = new Gradient();
grad->addColor(GradientColor(5.0/255.0, 5.0/255.0, 60.0/255.0));
grad->addColor(GradientColor(5.0/255.0, 20.0/255.0, 120.0/255.0));
grad->addColor(GradientColor(50.0/255.0, 100.0/255.0, 200.0/255.0));
grad->addColor(GradientColor(75.0/255.0, 190.0/255.0, 100.0/255.0));
grad->addColor(GradientColor(240.0/255.0, 55.0/255.0, 5.0/255.0));
grad->addColor(GradientColor(255.0/255.0, 55.0/255.0, 100.0/255.0));
grad->addColor(GradientColor(255.0/255.0, 235.0/255.0, 100.0/255.0));
grad->addColor(GradientColor(250.0/255.0, 250.0/255.0, 250.0/255.0));
grad->generate(256);
gradients[COLOR_THEME_HD] = grad;
grad = new Gradient();
grad->addColor(GradientColor(5.0/255.0, 45.0/255.0, 10.0/255.0));
grad->addColor(GradientColor(30.0/255.0, 150.0/255.0, 40.0/255.0));
grad->addColor(GradientColor(40.0/255.0, 240.0/255.0, 60.0/255.0));
grad->addColor(GradientColor(250.0/255.0, 250.0/255.0, 250.0/255.0));
grad->generate(256);
gradients[COLOR_THEME_RADAR] = grad;
PrimaryGLContext(canvas, sharedContext), waterfall(0), waterfall_tex(NULL), waterfall_lines(0), fft_size(0), activeTheme(NULL) {
}
void WaterfallContext::Setup(int fft_size_in, int num_waterfall_lines_in) {
@@ -113,34 +37,25 @@ void WaterfallContext::Setup(int fft_size_in, int num_waterfall_lines_in) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelTransferi(GL_MAP_COLOR, GL_TRUE);
glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, &(gradients[theme]->getRed())[0]);
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, &(gradients[theme]->getGreen())[0]);
glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, &(gradients[theme]->getBlue())[0]);
}
void WaterfallContext::setTheme(int theme_id) {
void WaterfallContext::refreshTheme() {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, waterfall);
if (theme >= COLOR_THEME_MAX) {
theme = COLOR_THEME_MAX - 1;
}
if (theme < 0) {
theme = 0;
}
theme = theme_id;
glPixelTransferi(GL_MAP_COLOR, GL_TRUE);
glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, &(gradients[theme]->getRed())[0]);
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, &(gradients[theme]->getGreen())[0]);
glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, &(gradients[theme]->getBlue())[0]);
glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, &(ThemeMgr::mgr.currentTheme->waterfallGradient.getRed())[0]);
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, &(ThemeMgr::mgr.currentTheme->waterfallGradient.getGreen())[0]);
glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, &(ThemeMgr::mgr.currentTheme->waterfallGradient.getBlue())[0]);
}
void WaterfallContext::Draw(std::vector<float> &points) {
if (activeTheme != ThemeMgr::mgr.currentTheme) {
refreshTheme();
activeTheme = ThemeMgr::mgr.currentTheme;
}
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
if (points.size()) {
@@ -180,7 +95,3 @@ void WaterfallContext::Draw(std::vector<float> &points) {
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
int WaterfallContext::getTheme() {
return theme;
}
+4 -14
View File
@@ -2,16 +2,7 @@
#include "PrimaryGLContext.h"
#include "Gradient.h"
#define COLOR_THEME_DEFAULT 0
#define COLOR_THEME_BW 1
#define COLOR_THEME_SHARP 2
#define COLOR_THEME_RAD 3
#define COLOR_THEME_TOUCH 4
#define COLOR_THEME_HD 5
#define COLOR_THEME_RADAR 6
#define COLOR_THEME_MAX 7
#include "ColorTheme.h"
class WaterfallCanvas;
@@ -21,14 +12,13 @@ public:
void Draw(std::vector<float> &points);
void Setup(int fft_size_in, int num_waterfall_lines_in);
void setTheme(int theme_id);
int getTheme();
void refreshTheme();
private:
Gradient *gradients[COLOR_THEME_MAX];
GLuint waterfall;
int theme;
unsigned char *waterfall_tex;
int fft_size;
int waterfall_lines;
ColorTheme *activeTheme;
};