X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Finput%2Fsmoothcontrol.cpp;h=6f4f5a487857deebe9fdaeaec277def92126937e;hb=207eec91afc6b538753ddc44905ac9ddbc907ac0;hp=69dfacf955049f38000f170cd45e8aa91ddaefe0;hpb=999ca92aa9ee10585c0b2094d84364159253982f;p=libs%2Fgui.git diff --git a/source/input/smoothcontrol.cpp b/source/input/smoothcontrol.cpp index 69dfacf..6f4f5a4 100644 --- a/source/input/smoothcontrol.cpp +++ b/source/input/smoothcontrol.cpp @@ -1,42 +1,59 @@ -/* $Id$ - -This file is part of libmspgbase -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - +#include #include "smoothcontrol.h" +using namespace std; + namespace Msp { namespace Input { SmoothControl::SmoothControl(): value(0), - paired_ctrl(0) + paired_ctrl(0), + dead_zone(0.1), + threshold(0.9) { } SmoothControl::SmoothControl(const ControlSource &s): Control(s), value(0), - paired_ctrl(0) + paired_ctrl(0), + dead_zone(0.1), + threshold(0.9) { } SmoothControl::SmoothControl(Device &d, ControlSrcType t, unsigned i): Control(d, t, i), value(0), - paired_ctrl(0) + paired_ctrl(0), + dead_zone(0.1), + threshold(0.9) { } -SmoothControl &SmoothControl::operator=(const SmoothControl &sc) +SmoothControl::~SmoothControl() { - Control::operator=(sc); + pair(0); +} - 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 +63,12 @@ void SmoothControl::pair(SmoothControl *ctrl) if(paired_ctrl) { - SmoothControl *old_pair=paired_ctrl; - paired_ctrl=0; + SmoothControl *old_pair = paired_ctrl; + paired_ctrl = 0; old_pair->pair(0); } - paired_ctrl=ctrl; + paired_ctrl = ctrl; if(paired_ctrl) paired_ctrl->pair(this); @@ -68,13 +85,29 @@ 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; + 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; + } + 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