commit fd511fc1a706e4ae8a753be9606e2c6cdb0d4a33
parent dce8241e738167fc99d2cb5f50dfd2431d9ea815
Author: Johannes Lorenz <j.git@lorenz-ho.me>
Date: Wed, 8 Apr 2020 18:43:07 +0200
Fl_Osc_Dial: Enable float dials
Diffstat:
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/src/UI/Fl_Osc_Dial.H b/src/UI/Fl_Osc_Dial.H
@@ -31,6 +31,7 @@ class Fl_Osc_Dial:public WidgetPDial, public Fl_Osc_Widget
//void OSC_value(float);
void OSC_value(int);
void OSC_value(char);
+ void OSC_value(float);
using Fl_Osc_Widget::OSC_value;
//Refetch parameter information
@@ -44,7 +45,14 @@ class Fl_Osc_Dial:public WidgetPDial, public Fl_Osc_Widget
virtual void rebase(std::string new_base) override;
void cb(void);
+
+ //! normally, it's all uchar. this hack makes it a float dial
+ void make_float() { dataType = dataTypeT::type_float; }
private:
+ enum class dataTypeT
+ {
+ type_uchar, type_float
+ } dataType = dataTypeT::type_uchar;
bool alt_style;
bool dead;
std::pair<Fl_Callback*, void*> cb_data;
diff --git a/src/UI/Fl_Osc_Dial.cpp b/src/UI/Fl_Osc_Dial.cpp
@@ -89,12 +89,20 @@ int Fl_Osc_Dial::handle(int ev)
void Fl_Osc_Dial::OSC_value(int v)
{
+ assert(dataType == dataTypeT::type_uchar);
value(v + value() - floorf(value()) +
(minimum() == 64 ? 0 : minimum()));
}
+void Fl_Osc_Dial::OSC_value(float v)
+{
+ assert(dataType == dataTypeT::type_float);
+ value(v);
+}
+
void Fl_Osc_Dial::OSC_value(char v)
{
+ assert(dataType == dataTypeT::type_uchar);
value(v + value() - floorf(value()) +
minimum());
}
@@ -108,10 +116,19 @@ void Fl_Osc_Dial::cb(void)
{
assert(osc);
- if(64 != (int)minimum())
- oscWrite(ext, "i", (int)(value()-minimum()));
- else
- oscWrite(ext, "i", (int)(value()));
+ if(dataType == dataTypeT::type_uchar)
+ {
+ if(64 != (int)minimum())
+ oscWrite(ext, "i", (int)(value()-minimum()));
+ else
+ oscWrite(ext, "i", (int)(value()));
+ }
+ else if(dataType == dataTypeT::type_float)
+ {
+ oscWrite(ext, "f", static_cast<float>(value()));
+ }
+ else { assert(false); }
+
if(cb_data.first)
cb_data.first(this, cb_data.second);