]> git.tdb.fi Git - libs/gui.git/commitdiff
Improve SmoothControl range API
authorMikko Rasa <tdb@tdb.fi>
Fri, 19 Dec 2014 03:04:11 +0000 (05:04 +0200)
committerMikko Rasa <tdb@tdb.fi>
Fri, 19 Dec 2014 03:07:44 +0000 (05:07 +0200)
Since gestures can generate axis values greater than one, the ability to
disable the upper threshold becomes necessary.

source/input/smoothcontrol.cpp
source/input/smoothcontrol.h

index f32e551d89c682e34e9de5157c83e400a6dd8938..6f4f5a487857deebe9fdaeaec277def92126937e 100644 (file)
@@ -1,5 +1,8 @@
+#include <stdexcept>
 #include "smoothcontrol.h"
 
+using namespace std;
+
 namespace Msp {
 namespace Input {
 
@@ -33,11 +36,23 @@ SmoothControl::~SmoothControl()
 
 void SmoothControl::set_dead_zone(float d)
 {
+       if(d<0 || (threshold>0 && d>=threshold))
+               throw invalid_argument("SmoothControl::set_dead_zone");
        dead_zone = d;
 }
 
 void SmoothControl::set_threshold(float t)
 {
+       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;
 }
 
@@ -72,17 +87,23 @@ void SmoothControl::on_release()
 
 void SmoothControl::on_motion(float v, float r)
 {
-       if(v<-threshold)
-               value = -1;
-       else if(v>threshold)
-               value = 1;
-       else if(v<-dead_zone)
-               value = (v+dead_zone)/(threshold-dead_zone);
+       if(v<-dead_zone)
+               value = v+dead_zone;
        else if(v>dead_zone)
-               value = (v-dead_zone)/(threshold-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;
+       }
+
        signal_motion.emit(value);
 
        if(paired_ctrl && (v>0 || (v==0 && paired_ctrl->value!=0)))
index 78edbb3acd64a73b26a4ee9391c9b855b3ae5003..f16177b2b2ea0076dc176ab9b0f7da76ec747506 100644 (file)
@@ -34,9 +34,13 @@ public:
        /// Sets the dead zone value.  Any value below this will be treated as 0.
        void set_dead_zone(float);
 
-       /// Sets the max-out threshold.  Any value above this will be treated as 1.
+       /** Sets the max-out threshold.  Any value above this will be treated as 1.
+       A negative value can be used to disable the threshold entirely. */
        void set_threshold(float);
 
+       /// Sets dead zone and threshold in a single function call.
+       void set_range(float, float);
+
        void pair(SmoothControl *ctrl);
        float get_value() const { return value; }