-import sys
-import pygame
import helpers
-import threading
-pygame.mixer.pre_init(frequency = 44100)
-pygame.init()
+helpers.parse_args()
+
+import kivy
+kivy.require("1.9.1")
+from kivy.app import App
+from kivy.uix.floatlayout import FloatLayout
+from kivy.uix.relativelayout import RelativeLayout
+from kivy.properties import ListProperty, StringProperty
+from kivy.clock import Clock
+from kivy.core.window import Window
+from kivy.lang import Builder
+from helpers.key import Key
+from helpers.mapping import Mapping
+
+class KeyList(RelativeLayout):
+ keylist = ListProperty([])
+ first_key = StringProperty("")
+ second_key = StringProperty("")
+ third_key = StringProperty("")
+
+ def append(self, value):
+ self.keylist.insert(0, value)
+
+ def on_keylist(self, instance, new_key_list):
+ if len(self.keylist) > 0:
+ self.first_key = self.keylist[0]
+ if len(self.keylist) > 1:
+ self.second_key = self.keylist[1]
+ if len(self.keylist) > 2:
+ self.third_key = self.keylist[2]
+
+class PlayList(RelativeLayout):
+ playlist = ListProperty([])
+
+ def __init__(self, **kwargs):
+ super(PlayList, self).__init__(**kwargs)
+ Clock.schedule_interval(self.update_playlist, 0.5)
+
+ def update_playlist(self, dt):
+ if self.parent is None or 'Mapping' not in self.parent.ids:
+ return True
+
+ open_files = self.parent.ids['Mapping'].open_files
+ self.playlist = []
+ for music_file in open_files.values():
+ if not music_file.is_in_use():
+ continue
-size = width, height = 913, 563
-screen = pygame.display.set_mode(size)
-screen.fill((229, 228, 226))
+ text = "{}/{}".format(
+ helpers.duration_to_min_sec(music_file.sound_position),
+ helpers.duration_to_min_sec(music_file.sound_duration))
-draw_lock = helpers.Lock("draw")
+ if music_file.is_loaded_paused():
+ self.playlist.append(["⏸", music_file.name, text, False])
+ else:
+ self.playlist.append(["⏵", music_file.name, text, True])
-mapping = helpers.Mapping(screen, draw_lock)
-channel_number, open_files = helpers.parse_config(mapping)
-pygame.mixer.set_num_channels(channel_number)
-mapping.draw()
+class ActionList(RelativeLayout):
+ action_title = StringProperty("")
+ action_list = ListProperty([])
-draw_lock.acquire()
-pygame.display.flip()
-draw_lock.release()
+ def update_list(self, key, action_number = 0):
+ self.action_title = "actions linked to key {}:".format(key.key_sym)
+ self.action_list = []
-contexts = [
- 'normal'
-]
+ action_descriptions = [action.description() for action in key.actions]
-context = 'normal'
+ for index, description in enumerate(action_descriptions):
+ if index < int(action_number):
+ icon = "✓"
+ elif index + 0.5 == action_number:
+ icon = "✅"
+ else:
+ icon = " "
-#### Normal workflow ####
-while 1:
- event = pygame.event.wait()
+ self.action_list.append([icon, description])
- if event.type == pygame.QUIT or (
- event.type == pygame.KEYDOWN and
- event.mod == 4160 and
- event.key == pygame.K_c):
- for thread in threading.enumerate():
- if thread.getName()[0:2] != "MS":
- continue
- thread.join()
-
- pygame.quit()
- sys.exit()
-
- if context == 'normal':
- if event.type == pygame.KEYDOWN:
- key = mapping.find_by_key_num(event.key)
- if key is not None and not key.disabled:
- threading.Thread(name = "MSKeyAction", target=key.do_actions).start()
- threading.Thread(name = "MSClic", target=key.list_actions, args = [screen]).start()
- elif event.type == pygame.MOUSEBUTTONUP:
- key = mapping.find_by_collidepoint(pygame.mouse.get_pos())
- if key is not None:
- threading.Thread(name = "MSClic", target=key.list_actions, args = [screen]).start()
-
- draw_lock.acquire()
- police = helpers.font(14)
- icon_police = helpers.font(14, font = "Symbola")
-
- surface = pygame.Surface((208, 250)).convert()
- surface.fill((250, 250, 250))
- offset = 0
- for music_file in open_files.values():
- police.set_bold(False)
- if music_file.is_playing():
- if music_file.is_paused():
- icon = icon_police.render("⏸", True, (0,0,0))
- else:
- icon = icon_police.render("⏵", True, (0,0,0))
- police.set_bold(True)
- text = police.render(music_file.name, True, (0,0,0))
- surface.blit(icon, (0, offset))
- surface.blit(text, (20, offset))
- offset += police.get_linesize()
- screen.blit(surface, (700, 308))
-
- pygame.display.flip()
- draw_lock.release()
-
-#### In Ipython ####
-# for thread in threading.enumerate():
-# if thread.getName()[0:2] != "MS":
-# continue
-# thread.join()
+class Screen(FloatLayout):
+ pass
+
+class MusicSamplerApp(App):
+ def build(self):
+ Window.size = (913, 563)
+
+ return Screen()
+
+if __name__ == '__main__':
+ Builder.load_file(helpers.path() + "/music_sampler.kv")
+ MusicSamplerApp().run()