I have a lot of boards and usually need to re-use code even for different projects.

text_editor.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. # GUIDE
  2. # type freely! CTRL+D clears the text.
  3. # CTRL + S to Save
  4. # CTRL + O to Open
  5. # DESIGNED TO WORK WITH SD CARD !!!
  6. # backspace, space, and return function as expected.
  7. # keys not recognised WILL print "UNKNOWN 0x??",
  8. # unless PRINT_UNKNOWN_KEYS is set to False
  9. # UP, DOWN, LEFT, RIGHT will print,
  10. # unless PRINT_COMMAND_KEYS is set to False
  11. # TODO:
  12. # UP and DOWN scrolling
  13. # look into folders in SD card
  14. ######
  15. import board
  16. import terminalio
  17. from adafruit_display_text import label
  18. from keyboard import Keyboard
  19. import busio
  20. import sdcardio
  21. import storage
  22. import os
  23. def file_menu():
  24. files_text = ""
  25. index = 0
  26. for file in os.listdir("/sd"):
  27. filename = str(file)
  28. if index == open_cursor:
  29. filename = "> " + filename
  30. files_text = files_text + filename+"\n"
  31. index += 1
  32. files_group.text = files_text
  33. ## SD Card set up for saving text to SD card
  34. spi = busio.SPI(board.SD_SCK, MOSI=board.SD_MOSI, MISO=board.SD_MISO)
  35. cs = board.SD_CS
  36. try:
  37. sdcard = sdcardio.SDCard(spi, cs)
  38. vfs = storage.VfsFat(sdcard)
  39. storage.mount(vfs, "/sd", readonly=False) # access files on sd card here
  40. SD_status = "SD Card Mounted"
  41. except OSError:
  42. SD_status = "No SD card found"
  43. pass # SD card not inserted/found
  44. #########################################
  45. keyb = Keyboard()
  46. PRINT_UNKNOWN_KEYS = False
  47. PRINT_COMMAND_KEYS = False
  48. COMMAND_KEYS = ["UP", "DOWN", "LEFT", "RIGHT"]
  49. page = "editor"
  50. intro_text = "Press CTRL+D to clear text\n"+SD_status+"\n\n"
  51. intro_text_area = label.Label(terminalio.FONT, text=intro_text, color="C3B")
  52. intro_text_area.x = 10
  53. intro_text_area.y = 10
  54. text = ""
  55. text_area = label.Label(terminalio.FONT, text=text)
  56. text_area.x = 0
  57. text_area.y = 30
  58. board.DISPLAY.root_group = intro_text_area
  59. intro_text_area.append(text_area)
  60. filename_text = ""
  61. save_text = "Save File - Enter Filename\nOverwriting Enabled"
  62. save_group = label.Label(terminalio.FONT, text=save_text, color="C3B")
  63. save_group.x = 10
  64. save_group.y = 10
  65. filename_group = label.Label(terminalio.FONT, text=filename_text)
  66. filename_group.x = 0
  67. filename_group.y = 60
  68. save_group.append(filename_group)
  69. files_text = ""
  70. open_text = "Open File - Select using arrow keys"
  71. open_group = label.Label(terminalio.FONT, text=open_text, color="C3B")
  72. open_group.x = 10
  73. open_group.y = 10
  74. files_group = label.Label(terminalio.FONT, text=files_text)
  75. files_group.x = 0
  76. files_group.y = 30
  77. open_group.append(files_group)
  78. open_cursor = 0
  79. while True:
  80. key = keyb.scan()
  81. if key == "BACKSP":
  82. if page == "editor":
  83. text = text[:-1]
  84. text_area.text = text
  85. elif page == "save":
  86. filename_text = filename_text[:-1]
  87. filename_group.text = filename_text
  88. elif key == "CTRLD":
  89. if page == "editor":
  90. text = ""
  91. text_area.text = text
  92. elif page == "save":
  93. filename_text = ""
  94. filename_group.text = filename_text
  95. elif key == "CTRLS":
  96. board.DISPLAY.root_group = save_group
  97. page = "save"
  98. filename_group.text=filename_text
  99. elif key == "CTRLO":
  100. board.DISPLAY.root_group = open_group
  101. page="open"
  102. file_menu()
  103. elif key == "ESC":
  104. if page == "editor":
  105. pass
  106. elif page == "save" or page == "open":
  107. board.DISPLAY.root_group = intro_text_area
  108. page = "editor"
  109. else:
  110. ## The actual editor
  111. if page == "editor":
  112. if "UNKNOWN" in key and PRINT_UNKNOWN_KEYS == False:
  113. pass
  114. elif key in COMMAND_KEYS and PRINT_COMMAND_KEYS == False:
  115. pass
  116. else:
  117. ## WRAPPING
  118. ## calculate wrapping when entering a character
  119. lines = text.split("\n")
  120. current_line = lines[len(lines)-1]
  121. if len(current_line) > 35:
  122. text=text+"\n" # <- start a new line here
  123. ##############################################
  124. text = text+key
  125. text_area.text = text
  126. ## The save file menu - for typing the filename
  127. elif page == "save":
  128. if key == "DOWN":
  129. filename_text = filename_text + "."
  130. filename_group.text = filename_text
  131. elif key == "\n":
  132. with open("/sd/"+filename_text, "w") as f:
  133. f.write(text)
  134. f.close()
  135. board.DISPLAY.root_group = intro_text_area
  136. page = "editor"
  137. elif not keyb.is_alphanumeric(key):
  138. pass # dont allow special characters to be entered
  139. else:
  140. filename_text = filename_text+key
  141. filename_group.text=filename_text
  142. ## The open file menu - for selecting a file
  143. elif page == "open":
  144. if key == "UP":
  145. if open_cursor == 0:
  146. pass
  147. else:
  148. open_cursor -= 1
  149. file_menu()
  150. elif key == "DOWN":
  151. if open_cursor == len(os.listdir("/sd"))-1:
  152. pass
  153. else:
  154. open_cursor += 1
  155. file_menu()
  156. elif key == "\n":
  157. text = ""
  158. fn = os.listdir("/sd")[open_cursor]
  159. with open("/sd/"+fn, "r") as f:
  160. lines = f.readlines()
  161. for line in lines:
  162. text = text + line
  163. text_area.text = text
  164. filename_text = fn
  165. filename_group.text=filename_text
  166. page = "editor"
  167. board.DISPLAY.root_group = intro_text_area