X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=helpers%2Fkey.py;h=658c17f485e197d80d089737124f8ec25731a4bb;hb=4b2d79ca27dcbb85465829595ad81cec5fc63983;hp=d923b1dcde7a7d0bbd51ce0b344a24b6d2da1882;hpb=8612c5f8bb0fc9529bc489a6719654d4474db6d5;p=perso%2FImmae%2FProjets%2FPython%2FMusicSampler.git diff --git a/helpers/key.py b/helpers/key.py index d923b1d..658c17f 100644 --- a/helpers/key.py +++ b/helpers/key.py @@ -1,169 +1,101 @@ -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 .font import font import time -import sys -import pygame - -class Key: - 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 = ( 0, 255, 0, 100) - - 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 - - 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) - self.disabled = disabled - - 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 + + color = AliasProperty(get_color, set_color, bind=['is_key_ready']) - self.inner_color = self.default_inner_color + def __init__(self, **kwargs): + super(Key, self).__init__(**kwargs) self.actions = [] - self.description = [] - self.custom_color = self.mapped_inner_color - self.custom_unready_color = self.mapped_unready_inner_color - - def square(self, all_actions_ready): - if self.has_actions(): - if all_actions_ready: - self.inner_color = self.custom_color - else: - self.inner_color = self.custom_unready_color - 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 + + self.config = self.parent.key_config[key_sym] - def collidepoint(self, position): - return self.surface.get_rect().collidepoint( - position[0] - self.position[0], - position[1] - self.position[1] - ) + self.actions = [] + for key_action in self.config['actions']: + self.add_action(key_action[0], **key_action[1]) + + 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']) + + Clock.schedule_interval(self.check_all_active, 1) + + def check_all_active(self, dt): + if self.all_actions_ready: + self.is_key_ready = True + return False def set_description(self, description): - for desc in 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)) + self.description.append(str(desc).replace(" ", " ")) def set_color(self, color): - self.custom_color = tuple(color) - color.append(100) + color = [x / 255 for x in color] + color.append(1) + self.custom_color = color + color[3] = 100 / 255 self.custom_unready_color = tuple(color) - def draw(self, background_surface): - self.draw_lock.acquire() - all_actions_ready = self.all_actions_ready() - - self.surface = self.square(all_actions_ready).surface() - - police = font(14) - text_police = font(10) - - police.set_bold(True) - text = police.render(self.key_sym, True, (0,0,0)) - self.surface.blit(text, (5,5)) - - is_first_line = True - offset = 11 + text_police.get_linesize() - 4 - first_line_offset = 18 - for description in self.description: - text = text_police.render(description, True, (0,0,0)) - if is_first_line: - self.surface.blit(text, (first_line_offset, 9)) - is_first_line = False - else: - self.surface.blit(text, (3, offset)) - offset += text_police.get_linesize() - 4 - - background_surface.blit(self.surface, self.position) - self.draw_lock.release() - - return not all_actions_ready - - def poll_redraw(self, background): - while True: - time.sleep(1) - if self.all_actions_ready(): - self.draw(background) - self.mapping.blit() - break - + @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, screen): + def do_actions(self): print("running actions for {}".format(self.key_sym)) start_time = time.time() - self.mapping.start_running(self, start_time) + self.parent.start_running(self, start_time) action_number = 0 for action in self.actions: - if self.mapping.keep_running(self, start_time): - self.list_actions(screen, action_number = action_number + 0.5) + if self.parent.keep_running(self, start_time): + self.list_actions(action_number = action_number + 0.5) action.run() action_number += 1 - self.list_actions(screen, action_number = action_number) - - self.mapping.finished_running(self, start_time) - - def list_actions(self, screen, action_number = 0): - 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((690, 250)).convert() - surface.fill((250, 250, 250)) - police = font(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) - icon_police = font(14, font = "Symbola") - for index, description in enumerate(action_descriptions): - if index < int(action_number): - icon = icon_police.render("✓", True, (0,0,0)) - elif index + 0.5 == action_number: - icon = icon_police.render("✅", True, (0,0,0)) - else: - icon = icon_police.render(" ", True, (0,0,0)) - - text = police.render(description, True, (0,0,0)) - surface.blit(icon, (0, offset)) - surface.blit(text, (10, offset)) - offset += police.get_linesize() + self.list_actions(action_number = action_number) - screen.blit(surface, (5, 308)) - pygame.display.flip() - self.draw_lock.release() + 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() + pass