]> git.tdb.fi Git - libs/gui.git/blobdiff - source/input/smoothcontrol.cpp
Update .gitignore to include build products on Windows
[libs/gui.git] / source / input / smoothcontrol.cpp
index 69dfacf955049f38000f170cd45e8aa91ddaefe0..0532aef68ca66d62dc6d38808da0a08c07529eb9 100644 (file)
@@ -1,42 +1,44 @@
-/* $Id$
-
-This file is part of libmspgbase
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #include "smoothcontrol.h"
+#include <stdexcept>
+
+using namespace std;
 
 namespace Msp {
 namespace Input {
 
-SmoothControl::SmoothControl():
-       value(0),
-       paired_ctrl(0)
-{ }
-
 SmoothControl::SmoothControl(const ControlSource &s):
-       Control(s),
-       value(0),
-       paired_ctrl(0)
+       Control(s)
 { }
 
 SmoothControl::SmoothControl(Device &d, ControlSrcType t, unsigned i):
-       Control(d, t, i),
-       value(0),
-       paired_ctrl(0)
+       Control(d, t, i)
 { }
 
-SmoothControl &SmoothControl::operator=(const SmoothControl &sc)
+SmoothControl::~SmoothControl()
 {
-       Control::operator=(sc);
+       pair(nullptr);
+}
 
-       return *this;
+void SmoothControl::set_dead_zone(float d)
+{
+       if(d<0 || (threshold>0 && d>=threshold))
+               throw invalid_argument("SmoothControl::set_dead_zone");
+       dead_zone = d;
 }
 
-SmoothControl::~SmoothControl()
+void SmoothControl::set_threshold(float t)
 {
-       pair(0);
+       if(t>=0 && t<=dead_zone)
+               throw invalid_argument("SmoothControl::set_threshold");
+       threshold = t;
+}
+
+void SmoothControl::set_range(float d, float t)
+{
+       if(d<0 || (t>=0 && d>=t))
+               throw invalid_argument("SmoothControl::set_range");
+       dead_zone = d;
+       threshold = t;
 }
 
 void SmoothControl::pair(SmoothControl *ctrl)
@@ -46,12 +48,12 @@ void SmoothControl::pair(SmoothControl *ctrl)
 
        if(paired_ctrl)
        {
-               SmoothControl *old_pair=paired_ctrl;
-               paired_ctrl=0;
-               old_pair->pair(0);
+               SmoothControl *old_pair = paired_ctrl;
+               paired_ctrl = nullptr;
+               old_pair->pair(nullptr);
        }
 
-       paired_ctrl=ctrl;
+       paired_ctrl = ctrl;
 
        if(paired_ctrl)
                paired_ctrl->pair(this);
@@ -68,13 +70,35 @@ void SmoothControl::on_release()
                on_motion(0, -value);
 }
 
-void SmoothControl::on_motion(float v, float)
+void SmoothControl::on_motion(float v, float r)
 {
-       value=v;
+       float old_value = value;
+       if(v<-dead_zone)
+               value = v+dead_zone;
+       else if(v>dead_zone)
+               value = v-dead_zone;
+       else
+               value = 0;
+
+       if(threshold>=0)
+       {
+               if(v<-threshold)
+                       value = -1;
+               else if(v>threshold)
+                       value = 1;
+               else
+                       value /= threshold-dead_zone;
+       }
+
+       if(value && !old_value)
+               rising_edge = true;
+       else if(!value && old_value)
+               falling_edge = true;
+
        signal_motion.emit(value);
-       
-       if(paired_ctrl && paired_ctrl->get_value()!=-value)
-               paired_ctrl->on_motion(-value, -value-paired_ctrl->get_value());
+
+       if(paired_ctrl && (v>0 || (v==0 && paired_ctrl->value!=0)))
+               paired_ctrl->on_motion(-v, -r);
 }
 
 } // namespace Input