X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=helpers%2Fkey.py;h=34c51406e8d1ca9f35cd94d4e53ce3f85b2845d5;hb=2e4049036ec4d90a9daeff606d821d2ac2d023ce;hp=6997e702d75a78040e391e77e225a02a40b08d76;hpb=ba9ea93a0f52178d24a606fddc2acc5dc85b7ff2;p=perso%2FImmae%2FProjets%2FPython%2FMusicSampler.git diff --git a/helpers/key.py b/helpers/key.py index 6997e70..34c5140 100644 --- a/helpers/key.py +++ b/helpers/key.py @@ -1,143 +1,109 @@ -from .rounded_rect import * +from kivy.uix.widget import Widget +from kivy.properties import AliasProperty, BooleanProperty, \ + ListProperty, StringProperty +from kivy.clock import Clock +from kivy.uix.behaviors import ButtonBehavior + from .action import * +from . import debug_print import time -import sys -import pygame - -class Key: - row_positions = { - 'first': 0, - 'second': 50, - 'third': 100, - 'fourth': 150, - 'fifth': 200, - 'sixth': 250, - } - - default_outer_color = (120, 120, 120) - lighter_outer_color = (200, 200, 200) - default_inner_color = (255, 255, 255) - mapped_inner_color = ( 0, 255, 0) - mapped_unready_inner_color = (255, 165, 0) - - def __init__(self, mapping, draw_lock, key_name, key_sym, top, left, width = 48, height = 48, disabled = False): - self.draw_lock = draw_lock - self.mapping = mapping - self.key_name = key_name - self.key_sym = key_sym - - if isinstance(top, str): - self.top = self.row_positions[top] - else: - self.top = top - - self.left = left - self.width = width - self.height = height - - self.bottom = self.top + self.height - self.right = self.left + self.width - - self.rect = (self.left, self.top, self.right, self.bottom) - self.position = (self.left, self.top) - if disabled: - self.outer_color = self.lighter_outer_color - self.linewidth = 1 +class Key(ButtonBehavior, Widget): + key_sym = StringProperty(None) + custom_color = ListProperty([0, 1, 0, 1]) + custom_unready_color = ListProperty([0, 1, 0, 100/255]) + description_title = StringProperty("") + description = ListProperty([]) + is_key_ready = BooleanProperty(True) + + def get_color(self): + if not self.has_actions: + return [1, 1, 1, 1] + elif self.all_actions_ready: + return self.custom_color else: - self.outer_color = self.default_outer_color - self.linewidth = 3 + return self.custom_unready_color + def set_color(self): + pass - self.inner_color = self.default_inner_color - self.actions = [] + color = AliasProperty(get_color, set_color, bind=['is_key_ready']) - def square(self, all_actions_ready): - if self.has_actions(): - if all_actions_ready: - self.inner_color = self.mapped_inner_color - else: - self.inner_color = self.mapped_unready_inner_color + def __init__(self, **kwargs): + super(Key, self).__init__(**kwargs) + self.actions = [] - return RoundedRect((0, 0, self.width, self.height), - self.outer_color, self.inner_color, self.linewidth) + def on_key_sym(self, key, key_sym): + if key_sym in self.parent.key_config: + self.is_key_ready = False - def collidepoint(self, position): - return self.surface.get_rect().collidepoint( - position[0] - self.position[0], - position[1] - self.position[1] - ) + self.config = self.parent.key_config[key_sym] - def draw(self, background_surface): - self.draw_lock.acquire() - all_actions_ready = self.all_actions_ready() + self.actions = [] + for key_action in self.config['actions']: + self.add_action(key_action[0], **key_action[1]) - self.surface = self.square(all_actions_ready).surface() + if 'description' in self.config['properties']: + key.set_description(self.config['properties']['description']) + if 'color' in self.config['properties']: + key.set_color(self.config['properties']['color']) - if getattr(sys, 'frozen', False): - police = pygame.font.Font(sys._MEIPASS + "/Ubuntu-Regular.ttf", 14) - else: - police = pygame.font.Font("Ubuntu-Regular.ttf", 14) + Clock.schedule_interval(self.check_all_active, 1) - text = police.render(self.key_sym, True, (0,0,0)) - self.surface.blit(text, (5,5)) - background_surface.blit(self.surface, self.position) - self.draw_lock.release() + def check_all_active(self, dt): + if self.all_actions_ready: + self.is_key_ready = True + return False - return not all_actions_ready + def set_description(self, description): + if description[0] is not None: + self.description_title = str(description[0]) + for desc in description[1 :]: + if desc is None: + self.description.append("") + else: + self.description.append(str(desc).replace(" ", " ")) - def poll_redraw(self, background): - while True: - time.sleep(1) - if self.all_actions_ready(): - self.draw(background) - self.mapping.blit() - break + def set_color(self, color): + color = [x / 255 for x in color] + color.append(1) + self.custom_color = color + color[3] = 100 / 255 + self.custom_unready_color = tuple(color) + @property def has_actions(self): return len(self.actions) > 0 + @property def all_actions_ready(self): return all(action.ready() for action in self.actions) def add_action(self, action_name, **arguments): self.actions.append(Action(action_name, self, **arguments)) - def do_actions(self): - print("running actions for {}".format(self.key_sym)) - start_time = time.time() - self.mapping.start_running(self, start_time) - for action in self.actions: - if self.mapping.keep_running(self, start_time): - action.run() - - self.mapping.finished_running(self, start_time) - - def list_actions(self, screen): - action_descriptions = [action.description() for action in self.actions] - print("actions linked to key {}:".format(self.key_sym)) - print("\t" + "\n\t".join(action_descriptions)) - self.draw_lock.acquire() - surface = pygame.Surface((800, 250)).convert() - surface.fill((250, 250, 250)) - if getattr(sys, 'frozen', False): - police = pygame.font.Font(sys._MEIPASS + "/Ubuntu-Regular.ttf", 14) - else: - police = pygame.font.Font("Ubuntu-Regular.ttf", 14) - - offset = 0 - police.set_bold(True) - text = police.render("actions linked to key {}:".format(self.key_sym), True, (0,0,0)) - surface.blit(text, (0, offset)) - offset += police.get_linesize() - - police.set_bold(False) - for description in action_descriptions: - text = police.render(description, True, (0,0,0)) - surface.blit(text, (0, offset)) - offset += police.get_linesize() - - screen.blit(surface, (10, 330)) - pygame.display.flip() - self.draw_lock.release() + def interrupt_action(self): + self.current_action.interrupt() + def do_actions(self): + if not self.enabled: + return None + self.parent.parent.ids['KeyList'].append(self.key_sym) + debug_print("running actions for {}".format(self.key_sym)) + start_time = time.time() + self.parent.start_running(self, start_time) + action_number = 0 + for self.current_action in self.actions: + if self.parent.keep_running(self, start_time): + self.list_actions(action_number=action_number + 0.5) + self.current_action.run() + action_number += 1 + self.list_actions(action_number=action_number) + + self.parent.finished_running(self, start_time) + + def list_actions(self, action_number=0): + self.parent.parent.ids['ActionList'].update_list(self, action_number) + + def on_press(self): + self.list_actions()