Skip to content
Snippets Groups Projects
Forked from flow3r / flow3r firmware
1421 commits behind the upstream repository.
control.py 3.00 KiB
import ui

class Control():
    def __init__(self,name, default=0, on_set=None, on_get=None, on_mod=None):
        #TODO inheritance from Control()
        self.name=name
        self.on_set = on_set
        self.on_get = on_get
        self.on_mod = on_mod

        if not self.on_get:
            self._value = default
        self.ui = ui.IconValue(label=self.name,size=60, value=self.get_value())
        self.ui.get_value = self.get_normal_value

    def draw(self):
        self.ui.value = self.get_value()
        print("draw: value", self.get_value())
        self.ui.draw()

    def get_normal_value(self):
        v = self.get_value()
        n = min(1,max(0,v))
        return n

    def get_value(self,update=True):
        if update and self.on_get:
            self._value = self.on_get()
        return self._value

    def set_value(self, value, do_trigger=True):
        self._value = value
        if do_trigger:
            if self.on_set:
                self.on_set(value)
    
    def mod_value(self,delta):
        self._value = self.on_mod(delta)

    
    def enter(self):
        pass
    
    def scroll(self,delta):
        pass

    def touch_1d(self,x,z):
        pass
    
class ControlSwitch(Control):
    def enter(self):
        self.set_value(not self.get_value())
        self.draw()

    def scroll(self,delta):
        self.enter()

    def touch_1d(self,x,z):
        if z<0: #Release
            self.enter()


class ControlFloat(Control):
    def __init__(self, min=0.0,max=1.0,step=0.1, *args, **kwargs):
        self.min=min
        self.max=max
        self.step=step
        super().__init__(*args, **kwargs)

    def get_normal_value(self):
        v = self.get_value()
        n = (v-self.min)/(self.max-self.min)
        #print("normal:",v,n)
        return n

class ControlKnob(ControlFloat):
    def enter(self):
        #repeat action with current value
        self.set_value(self.get_value())
        self.draw()

    def scroll(self,delta):
        if self.on_mod:
            #print("control: on mod")
            self.on_mod(delta)

        elif self.on_set:
            v = self.get_value()
            v_new = max(self.min,min(self.max,v+delta*self.step))
            self.set_value(v_new)
        self.draw()

    def touch_1d(self,x,z):
        if z>0: #Inital Contact
            self._x_init = x

        if z==0: #Continous contact
            diff = self._x_init-x
            self.scroll(5*diff)
            
        if z<0: #Release
            pass


class ControlSlide(ControlFloat):
    def __init__(self, do_reset=True, *args, **kwargs):
        self.do_reset=do_reset
        super().__init__(*args, **kwargs)

    def touch_1d(self,x,z):
        if z>0: #Inital Contact
            self._saved_value = self.get_value()

        if z==0: #Continous contact
            v = (self.max-self.min)*x+self.min
            self.set_value(v)
            print("c",x,v,self.max,self.min)

        if z<0: #Release
            if self.do_reset:
                self.set_value(self._saved_value)
        self.draw()