Changeset - 60b6471fb0d2
[Not reviewed]
default
0 1 0
David McClosky - 20 years ago 2005-06-16 06:32:36
dmcc@bigasterisk.com
TkGyro: stamp current sub+level when toggling modes
1 file changed with 1 insertions and 0 deletions:
0 comments (0 inline, 0 general)
bin/gyrocontroller
Show inline comments
 
@@ -24,96 +24,97 @@ class circcycle:
 
                self.index = (-1 + delta) % len(self.sequence)
 
            elif delta < 0:
 
                self.index = delta % len(self.sequence)
 
        else:
 
            self.index = (self.index + delta) % len(self.sequence)
 
    def next(self):
 
        self.change_index(1)
 
        return self.sequence[self.index]
 
    def prev(self):
 
        self.change_index(-1)
 
        return self.sequence[self.index]
 

	
 
class AbstractSimpleController(SubClient):
 
    """Simple controller with minimal input and output:
 
    
 
    Input is 4 directions and 3 buttons.
 
    Output is an integer and a color and maybe more.
 
    
 
    Left + B1/right + B1: prev/next sub
 
    Y-axis + B2: set current level
 
    B3: toggle keep/solo mode
 
    Double-B3: clear kept levels"""
 
    def __init__(self, subnames):
 
        SubClient.__init__(self)
 
        self.subnames = subnames
 
        self.refresh()
 
    def refresh(self):
 
        # reload subs from disk
 
        self.submasters = Submasters()
 
        self.all_subs = circcycle(self.subnames)
 
        self.current_sub = self.submasters.get_sub_by_name(self.all_subs.next())
 
        self.current_level = 1.0
 
        self.kept_levels = {} # subname : level [0..1]
 
        self.keep_solo_mode = 'keep' # either 'keep' or 'solo'
 
    def clear_kept_levels(self):
 
        self.kept_levels.clear()
 
    def next(self):
 
        if self.keep_solo_mode == 'keep':
 
            self.kept_levels[self.current_sub] = self.current_level
 

	
 
        self.current_sub = self.submasters.get_sub_by_name(self.all_subs.next())
 
    def prev(self):
 
        if self.keep_solo_mode == 'keep':
 
            self.kept_levels[self.current_sub] = self.current_level
 

	
 
        self.current_sub = self.submasters.get_sub_by_name(self.all_subs.prev())
 
    def toggle_keep_mode(self):
 
        if self.keep_solo_mode == 'keep':
 
            self.kept_levels[self.current_sub] = self.current_level
 
            self.keep_solo_mode = 'solo'
 
        else:
 
            self.keep_solo_mode = 'keep'
 

	
 
    def get_levels_as_sub(self):
 
        if self.keep_solo_mode == 'keep':
 
            # send all levels in self.kept_levels
 
            levelsub = combine_subdict(self.kept_levels)
 
        else:
 
            levelsub = self.current_sub * self.current_level
 

	
 
        return levelsub
 

	
 
class TkGyro(Tk.Canvas, AbstractSimpleController):
 
    def __init__(self, master, subnames):
 
        Tk.Canvas.__init__(self, master, bg='black', bd=0, highlightthickness=0,
 
            confine=None)
 
        AbstractSimpleController.__init__(self, subnames)
 
        height = int(self.winfo_screenheight())
 
        width = int(self.winfo_screenwidth())
 
        self.left = self.create_rectangle((0, 0, width / 2, height),
 
            tags='left', fill='black')
 
        self.right = self.create_rectangle((width / 2, 0, width, height),
 
            tags='right', fill='black')
 

	
 
        # the text is disabled so that it doesn't receive events
 
        self.modetext = self.create_text((width / 2, height / 2), 
 
            font='Courier 200', fill='white', text=self.keep_solo_mode,
 
            state='disabled')
 
        self.flashtextafter = '' # current after timer for displaying text
 

	
 
        def setfill(item, color):
 
            self.itemconfig(item, fill=color)
 
        def setlevel(evt):
 
            if evt.state & 512:
 
                y = (height - evt.y) / float(height)
 
                self.flash_text('<%d>' % (y * 100))
 
                self.current_level = y
 
                self.send_levels()
 

	
 
        data = ((self.left, 'left', '#000099', self.prev), 
 
                (self.right, 'right', '#990000', self.next))
 
        for item, tag, color, method in data:
 
            self.tag_bind(tag, '<Enter>', 
 
                lambda evt, item=item, color=color: setfill(item, color))
 
            self.tag_bind(tag, '<Leave>', 
 
                lambda evt, item=item, color=color: setfill(item, 'black'))
 
            self.tag_bind(tag, '<ButtonPress-1>', 
0 comments (0 inline, 0 general)