raspberry pi zero based drum machine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sSelectFolder.py 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import FSM
  2. import utils as u
  3. import menus as m
  4. import pygame
  5. from itertools import cycle
  6. import glob
  7. import os
  8. #====================================
  9. State = type("State", (object,), {})
  10. #====================================
  11. class State(object):
  12. def __init__(self, FSM):
  13. self.FSM = FSM
  14. def Enter(self):
  15. pass
  16. def Execute(self):
  17. pass
  18. def Exit(self):
  19. pass
  20. class SelectFolder(State):
  21. def __init__(self,FSM):
  22. super(SelectFolder, self).__init__(FSM)
  23. def Enter(self):
  24. o = self.FSM.owner
  25. o.header_text = "Select Folder"
  26. o.pub.register("beat", self)
  27. self.cur_el = 0
  28. files = u.get_files(o.song_dir, '.zzz')
  29. files_trimmed = [os.path.basename(x) for x in files]
  30. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  31. files_trimmed.insert(0, '..')
  32. self.menu = files_trimmed
  33. if '_blank' in self.menu:
  34. self.menu.remove('_blank')
  35. if o.keyState[16] > 0 or o.keyState[17] > 0:
  36. pass
  37. else:
  38. u.draw_header(o)
  39. self.draw_main(o)
  40. o.update_display(0)
  41. super(SelectFolder, self).Enter()
  42. def Execute(self):
  43. o = self.FSM.owner
  44. m.menu1_actions(self, o)
  45. if o.keyState[16] == 1:
  46. m.draw_menu1(o)
  47. o.update_display(0)
  48. elif o.keyState[16] == 4:
  49. u.draw_header(o)
  50. self.draw_footer(o)
  51. self.draw_main(o)
  52. o.update_display(0)
  53. if o.keyState[17] == 4:
  54. u.draw_header(o)
  55. self.draw_footer(o)
  56. self.draw_main(o)
  57. o.update_display(0)
  58. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  59. u.draw_header(o)
  60. self.draw_footer(o)
  61. self.draw_main(o)
  62. o.update_display(0)
  63. if o.keyState[16] > 0 or o.keyState[17] > 0:
  64. pass
  65. else:
  66. u.scroll_ud(o, self)
  67. if o.keyState[2] == 1:
  68. self.FSM.ToTransition('toEnterText')
  69. if o.keyState[3] == 1:
  70. if self.menu[self.cur_el] == '..':
  71. if o.song_dir == o.base_song_dir:
  72. pass
  73. else:
  74. o.song_dir = os.path.dirname(os.path.dirname(o.song_dir))
  75. o.song_dir += '/'
  76. files = u.get_files(o.song_dir, '.zzz')
  77. files_trimmed = [os.path.basename(x) for x in files]
  78. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  79. files_trimmed.insert(0, '..')
  80. self.menu = files_trimmed
  81. if '_blank' in self.menu:
  82. self.menu.remove('_blank')
  83. u.draw_header(o)
  84. self.draw_footer(o)
  85. self.draw_main(o)
  86. o.update_display(0)
  87. elif os.path.isdir(o.song_dir + self.menu[self.cur_el]):
  88. o.song_dir += self.menu[self.cur_el] + '/'
  89. files = u.get_files(o.song_dir, '.zzz')
  90. files_trimmed = [os.path.basename(x) for x in files]
  91. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  92. files_trimmed.insert(0, '..')
  93. self.menu = files_trimmed
  94. if '_blank' in self.menu:
  95. self.menu.remove('_blank')
  96. u.draw_header(o)
  97. self.draw_footer(o)
  98. self.draw_main(o)
  99. o.update_display(0)
  100. else:
  101. pass
  102. def draw_main(self, o):
  103. al = []
  104. ypos = 30
  105. if self.cur_el > (len(self.menu) - 1):
  106. self.cur_el = 0
  107. if self.cur_el == 0:
  108. _iter = 0
  109. while _iter < 4:
  110. if _iter < (len(self.menu)):
  111. al.append(self.menu[_iter])
  112. _iter += 1
  113. elif self.cur_el == 1:
  114. al.append(self.menu[self.cur_el - 1])
  115. al.append(self.menu[self.cur_el])
  116. al.append(self.menu[self.cur_el + 1])
  117. al.append(self.menu[self.cur_el + 2])
  118. elif self.cur_el == (len(self.menu) - 2):
  119. al.append(self.menu[self.cur_el - 2])
  120. al.append(self.menu[self.cur_el - 1])
  121. al.append(self.menu[self.cur_el])
  122. al.append(self.menu[self.cur_el + 1])
  123. elif self.cur_el == (len(self.menu) - 1):
  124. al.append(self.menu[self.cur_el - 3])
  125. al.append(self.menu[self.cur_el - 2])
  126. al.append(self.menu[self.cur_el - 1])
  127. al.append(self.menu[self.cur_el])
  128. else:
  129. al.append(self.menu[self.cur_el - 1])
  130. al.append(self.menu[self.cur_el])
  131. al.append(self.menu[self.cur_el + 1])
  132. al.append(self.menu[self.cur_el + 2])
  133. _iter = 0
  134. for i in al:
  135. if i == self.menu[self.cur_el]:
  136. if os.path.isdir(o.song_dir + i):
  137. i += "/"
  138. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  139. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  140. else:
  141. if os.path.isdir(o.song_dir + i):
  142. i += "/"
  143. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  144. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  145. ypos += 20
  146. _iter += 1
  147. def draw_footer(self, o):
  148. _iter = 0
  149. width = o.width / 4
  150. xpos = 0
  151. yposa = 135 - 25
  152. yposb = 135
  153. opts = ["Up", "Down", "Use", "Open"]
  154. while _iter < 4:
  155. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  156. if o.keyState[_iter] == 1:
  157. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  158. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  159. else:
  160. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  161. xpos += width
  162. _iter += 1
  163. def ReceiveMessage(self, message):
  164. o = self.FSM.owner
  165. u.play_seq(o, message)
  166. def Exit(self):
  167. self.FSM.owner.pub.unregister("beat", self)