def renderFolders(path, upload_download, dest, singleFileSelection=False, localMode=False): actualFilePointer = 1 currentCursor = 1 shortArray = [] selectedDisplay = [] fb = fileBrowserDT(path) # RenderFolders while True: # sampler, synth, drum = update_Current_Storage_Status() if check_OP_1_Connection_Silent(): sampler, synth, drum = update_Current_Storage_Status() if "synth" in fb.structCurrentPath( ) or "Synth" in fb.structCurrentPath(): # Display synth and Sample Available availableSlots = config["Max_Synth_Synthesis_patches"] + config[ "Max_Synth_Sampler_patches"] - (synth + sampler) else: availableSlots = config["Max_Drum_Patches"] - drum else: availableSlots = 0 image = Image.new('1', (128, 64)) image.paste( Image.open(workDir + "/Assets/Img/FileBrowser.png").convert("1")) draw = ImageDraw.Draw(image) draw.text((2, -1), os.path.basename(fb.structCurrentPath()[:-1]), fill='black', font=getFont()) if config["OP_1_Mounted_Dir"] != "": if "synth" in fb.structCurrentPath().lower(): # Display synth and Sample Available draw.text((108, -2), str(availableSlots - len(fb.getCopyQueue())), fill='white', font=getFont()) else: # Display available drums draw.text((108, -2), str(availableSlots - len(fb.getCopyQueue())), fill='white', font=getFont()) else: draw.text((108, -2), "--", fill='white', font=getFont()) shortArray = shiftArray(fb.getDirList(), shortArray, 0) # Empty Folder if not shortArray: draw.text((5, 10), "[----Empty----]", fill='white', font=getFont()) displayImage(image) counter = 1 for i in shortArray: # Check if current item is selected selected = True if i in selectedDisplay else False # Render the AIF data from cursor landed item if "aif" in i and counter == currentCursor: try: synType, FX, LFO = analyzeAIF( os.path.join(fb.structCurrentPath(), i)) except: # AIF meta data not retrievable synType, FX, LFO = "N/A", "N/A", "N/A" pass # Render Patch Type draw.text((90, 17), str(get_abbreviation(synType)), fill='white', font=getSmallFont()) draw.text((90, 35), str(get_abbreviation(FX)), fill='white', font=getSmallFont()) draw.text((90, 54), str(get_abbreviation(LFO)), fill='white', font=getSmallFont()) # Remove extension for display and dash out long file names i = i.replace(".aif", "") if len(i) > 10: i = i[:10] + ".." # Iterate through selected queue and invert the color if selected: draw.rectangle(((9, counter * 10), (83, counter * 10 + 10)), 'white') draw.text((10, counter * 10), str(i), fill='black', font=getFont()) else: draw.text((10, counter * 10), str(i), fill='white', font=getFont()) # Render next item from current Directory counter += 1 # Render cursor if shortArray: draw.text((0, currentCursor * 10), ">", fill='white', font=getFont()) # Render Scroll Bar scrollBarXLocation = 86 # List Shorter than screen size, fill the whole scroll bar if len(fb.getDirList()) <= 5: draw.line((scrollBarXLocation, 10, scrollBarXLocation, 64), fill="white", width=1) else: scrollBarLength = int(getScrollBarSize(fb.getDirList())) offset = getOffset(fb.getDirList(), actualFilePointer - 1, scrollBarLength) draw.line((scrollBarXLocation, 10 + offset, scrollBarXLocation, 10 + scrollBarLength + offset), fill="white", width=1) # Update Image to the display displayImage(image) key = getKeyStroke() if key == "UP": if currentCursor - 1 < 1: temp = shortArray shortArray = shiftArray(fb.getDirList(), shortArray, -1) if temp != shortArray: actualFilePointer -= 1 else: currentCursor -= 1 actualFilePointer -= 1 if key == "DOWN": if currentCursor + 1 > len(shortArray): temp = shortArray shortArray = shiftArray(fb.getDirList(), shortArray, 1) if temp != shortArray: actualFilePointer += 1 else: currentCursor += 1 actualFilePointer += 1 if key == "LEFT": if len(fb.histQueue) > 1: currentCursor = actualFilePointer = 1 availableSlots += len(fb.getCopyQueue()) selectedDisplay = [] fb.clearCopyQueue() fb.prevPage() else: return if key == "RIGHT": if len(fb.getDirList()): if len(fb.getCopyQueue()) == 0 and "aif" not in fb.getDirList( )[actualFilePointer - 1]: fb.selectNewPath(fb.getDirList()[actualFilePointer - 1]) currentCursor = 1 actualFilePointer = 1 if key == "CENTER": # Start Multi-select. (Select and deselect, and add the selected ones to copy queue) if not singleFileSelection: currentFile = [] selectedFolderPath = "" if len(fb.getDirList()): currentFile = fb.getDirList()[actualFilePointer - 1] selectedFolderPath = fb.structCurrentPath() + currentFile # Add to copy if currentFile not in selectedDisplay: # Decrement Available Patches if os.path.isdir(selectedFolderPath): if availableSlots - len( listdir(selectedFolderPath)) >= 0 or config[ "OP_1_Mounted_Dir"] == "": selectedDisplay.append(currentFile) for i in listdir(selectedFolderPath): fb.addToCopyQueue(currentFile + "/" + i) if "media" not in fb.structCurrentPath(): availableSlots -= 1 else: print("Over Shoot") else: if availableSlots - 1 >= 0 or config[ "OP_1_Mounted_Dir"] == "": fb.addToCopyQueue(currentFile) selectedDisplay.append(currentFile) if "media" not in fb.structCurrentPath(): availableSlots -= 1 else: print("Over Shoot") else: # Remove form copy if os.path.isdir(selectedFolderPath): selectedDisplay.remove(currentFile) for i in listdir(selectedFolderPath): fb.removeFromCopyQueue(currentFile + "/" + i) if "media" not in fb.structCurrentPath(): availableSlots += 1 else: fb.removeFromCopyQueue(currentFile) selectedDisplay.remove(currentFile) if "media" not in fb.structCurrentPath(): availableSlots += 1 if key == "A": print("") # return if key == "B": if not singleFileSelection: if len(fb.getDirList()): currentFile = fb.getDirList()[actualFilePointer - 1] selectedFolderPath = fb.structCurrentPath() + currentFile fileCount = len(fb.getCopyQueue()) if len(selectedDisplay) == 0 and len(fb.getCopyQueue()) == 0: rtn = RenderOptionsMenu(["New Folder"], sort=False) if "New Folder" in rtn: name = renderRename("/New Folder", jsutName=True) if name != "": print(join(fb.currentDirPath, name), "Folder Created") try: createEmptyFolder(fb.currentDirPath, name) fb.updatePage() except OSError: print("Folder can not be created") print("Folder Created") else: print("Create Folder Canceled") # if len(fb.getCopyQueue()) == 0 or len(selectedDisplay) == 1: # # Takes case if non of the folder or file is selected # if os.path.isdir(selectedFolderPath): # for i in listdir(selectedFolderPath): # fb.addToCopyQueue(currentFile + "/" + i) # fileCount = len(fb.getCopyQueue()) # # availableSlots += len(fb.getCopyQueue()) # rtn = RenderOptionsMenu( # [upload_download + " " + str(fileCount) + " Patches", # "Delete " + str(fileCount) + "Patches", "New Folder"], sort=False) # else: # fb.addToCopyQueue(currentFile) # # availableSlots += 1 # rtn = RenderOptionsMenu([upload_download, "Rename", "Delete"], sort=False) else: if fileCount == 1: rtn = RenderOptionsMenu( [upload_download, "Rename", "Move", "Delete"], sort=False) else: rtn = RenderOptionsMenu([ upload_download + " " + str(fileCount) + " Patches", "Move " + str(fileCount) + " Patches", "Delete " + str(fileCount) + "Patches" ], sort=False) # if rtn == "RETURN": # availableSlots += fileCount else: currentFile = fb.getDirList()[actualFilePointer - 1] selectedFolderPath = fb.structCurrentPath() + currentFile if os.path.isdir(selectedFolderPath): return selectedFolderPath pass else: rtn = RenderOptionsMenu(["Copy / Overwrite", "Cancel"], title="Upload to OP-Z", sort=False) if "Copy / Overwrite" in rtn: currentFile = fb.getDirList()[actualFilePointer - 1] selectedFolderPath = fb.structCurrentPath() + currentFile return selectedFolderPath if "Cancel" in rtn: print("Canceled") return # Main File Actions if "Upload" in rtn or "Backup" in rtn: # List allowed if check_OP_1_Connection( ) and config["OP_1_Mounted_Dir"] != "": try: copyQueue = fb.getCopyQueue() if dest == "": dest = config["OP_1_Mounted_Dir"] fileTransferHelper(copyQueue, dest) except: pass elif "Move" in rtn: # Move files within folder if fb.getCopyQueue(): temp = fb.getCopyQueue()[0] parentDir = dirname(dirname(temp)) parentDirLst = os.listdir(parentDir) rtn = RenderOptionsMenu(parentDirLst, title="Move To ...", sort=False) if "RETURN" not in rtn: try: moveFilesToFolder(fb.getCopyQueue(), os.path.join(parentDir, rtn)) fb.clearCopyQueue() selectedDisplay = [] fb.updatePage() except OSError: print("File Moving Error") elif "Delete" in rtn: # List allowed # if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": try: if len(fb.getCopyQueue()) == 0: # Empty Folder Selected currentFolder = fb.getDirList()[actualFilePointer - 1] print(join(fb.structCurrentPath(), currentFolder)) shutil.rmtree( join(fb.structCurrentPath(), currentFolder)) else: # Deleting folder that have patches print("In!!") deleteHelper(fb.getCopyQueue()) # Current Folder is empty and no longer existed go to Prev Page if not os.path.exists(fb.structCurrentPath()): fb.prevPage() selectedDisplay = [] selected = [] fb.clearCopyQueue() # Finished deleting, refresh the file list for display fb.updatePage() except OSError: pass elif "Rename" in rtn: # Only one item is allowed # Rename Page print(fb.getCopyQueue()[0]) renderRename(str(fb.getCopyQueue()[0])) fb.updatePage() # currentCursor = 1 # actualFilePointer = 1 # fb.clearCopyQueue() # selectedDisplay = [] # Update Remain Available Patches Here sampler, synth, drum = update_Current_Storage_Status()
class PageRouter: pageQue = [MainPage] currentDist = [] font = getFont() smallFont = getSmallFont() def __init__(self): self.processState = False self.cursor = 1 def getListSize(self): return len(self.pageQue[-1]) def renderPage(self, action, cur): frameSize = (128, 64) image = Image.new('1', frameSize) draw = ImageDraw.Draw(image) currentDist = self.pageQue[-1] # Stay on same page (Up Down) Render Standard Menu if action == 0: draw.rectangle([(-1, 0), (128, 64)], 'black', 'white') draw.rectangle([(0, 0), (128, 10)], 'white') draw.text((2, 0), str(currentDist[0][0]), fill='black', font=self.font) draw.text((105, 0), readCapacity(), fill='black', font=self.smallFont) for i in range(1, len(currentDist)): draw.text((10, i * 10), str(currentDist[i][0]), fill='white', font=self.font) draw.text((2, cur * 10), ">", fill='white', font=self.font) # Action Events (RIGHT) if action == 1: if type(currentDist[cur][1]) is str: self.pageQue.append(["Action Page Route", -1]) self.actionRouter(currentDist[cur][1]) else: self.pageQue.append(currentDist[cur][1]) self.renderPage(0, 1) return # Previous Page (Left) if action == -1: if len(self.pageQue) > 1: self.pageQue = self.pageQue[:-1] self.renderPage(0, 1) return displayImage(image) def actionRouter(self, event): # =============Projects Actions =========== if event == "act_Backup_Project_From_OP_1": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": displayPng(workDir + "/Assets/Img/BackupProject.png") time.sleep(0.1) try: tape = TapeBackup() tape.copyToLocal() displayPng(workDir + "/Assets/Img/Done.png") time.sleep(0.1) getAnyKeyEvent() except: print("File Transfer Error") self.renderErrorMessagePage("File Transfer Error") self.renderPage(-1, 1) if event == "act_Load_Project_From_Local": # rtn = "RETURN" while True: temp = RenderOptionsMenu( getDirFileList(savePaths["Local_Projects"]), "Projects") if temp == "RETURN": break else: # while rtn == "RETURN": rtn = RenderOptionsMenu(["Upload", "Rename", "Delete"]) # temp = RenderOptionsMenu(getDirFileList(savePaths["Local_Projects"]), "Projects") if rtn == "Upload": pass elif rtn == "Rename": renderRename( os.path.join(savePaths["Local_Projects"], temp)) elif rtn == "Delete": deleteHelper( [os.path.join(savePaths["Local_Projects"], temp)]) elif rtn == "RETURN": pass self.renderPage(-1, 1) # ===========Patches Actions=========== if event == "OP1_Synth_Patches": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": renderFolders(config["OP_1_Mounted_Dir"] + "/synth", "Backup", savePaths["Local_Synth"]) self.renderPage(-1, 1) if event == "OP1_Drum_Patches": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": renderFolders(config["OP_1_Mounted_Dir"] + "/drum", "Backup", savePaths["Local_Drum"]) self.renderPage(-1, 1) if event == "UploadSynthPatches": renderFolders(savePaths["Local_Synth"], "Upload", config["OP_1_Mounted_Dir"] + "/synth") self.renderPage(-1, 1) if event == "UploadDrumPatches": renderFolders(savePaths["Local_Drum"], "Upload", config["OP_1_Mounted_Dir"] + "/drum") self.renderPage(-1, 1) if event == "act_5_Backup_All_Patches": image = Image.new('1', (128, 64)) image.paste( Image.open(workDir + "/Assets/Img/BackupProject.png").convert("1")) displayImage(image) time.sleep(0.1) self.renderPage(-1, 1) if event == "USB_MIDI_In_Test": startMidi() self.renderPage(-1, 1) if event == "USB_MIDI_Out_Test": usbMIDIOut() self.renderPage(-1, 1) # ===========Eject Actions=========== if event == "act_ESC_Eject_OP_1": try: if unmount_OP_1(): print("Ejected") except: print("Error") self.renderPage(-1, 1) # ============= MOUNT OPTION ============== if event == "act_ESC_Mount_OP_1": try: if do_mount(): print("Mounted") except: print("Error") self.renderPage(-1, 1) # ========= POWER OFF ==================== if event == "act_POWER_OFF": image = Image.new('1', (128, 64)) image.paste( Image.open(workDir + "/Assets/Img/PowerOff.png").convert("1")) displayImage(image) time.sleep(1.0) call("sudo shutdown -h now", shell=True) if event == "checkStorage": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": image = Image.new('1', (128, 64)) image.paste( Image.open(workDir + "/Assets/Img/Storage_64.png").convert("1")) draw = ImageDraw.Draw(image) sampler, synth, drum = update_Current_Storage_Status() Disk = subprocess.check_output( "df -h | awk '$NF==\"/\"{printf \"%d/%dGB %s\", $3,$2,$5}'", shell=True) draw.text((50, 13), Disk, font=getFont(), fill="white") # Disk Storage Render draw.text((28, 48), str(config["Max_Synth_Sampler_patches"] - sampler), font=getFont(), fill="white") draw.text((70, 48), str(config["Max_Synth_Synthesis_patches"] - synth), font=getFont(), fill="white") draw.text((112, 48), str(config["Max_Drum_Patches"] - drum), font=getFont(), fill="white") displayImage(image) getAnyKeyEvent() # Press any key to proceed else: print("Not Connected") self.renderPage(-1, 1) # Useful in "Are you sure to delete.", "Are you sure to rename" def renderConfirmation(self, message=""): """ Renders The Message and ask for yes or no :return: Boolean """ pass def renderErrorMessagePage(self, errorMessage=""): """
class PageRouter: pageQue = [MainPage] currentDist = [] cursorHistory = [] font = getFont() smallFont = getSmallFont() def __init__(self): self.processState = False self.cursor = 1 def getListSize(self): return len(self.pageQue[-1]) def renderPage(self, action, cur): frameSize = (128, 64) image = Image.new('1', frameSize) # Battery Icon draw = ImageDraw.Draw(image) currentDist = self.pageQue[-1] # Stay on same page (Up Down) Render Standard Menu if action == 0: draw.rectangle([(-1, 0), (128, 64)], 'black', 'white') draw.rectangle([(0, 0), (128, 10)], 'white') draw.text((2, 0), str(currentDist[0][0]), fill='black', font=self.font) if batteryConfig["enable"]: # Battery Level in percentage # draw.text((105, 0), readCapacity(), fill='black', font=self.smallFont) # Battery Level Icon icon = Image.open(os.path.join(workDir, getBatteryImagePath(readCapacity()))).convert("1") image.paste(icon, (117, 0)) for i in range(1, len(currentDist)): draw.text((10, i * 10), str(currentDist[i][0]), fill='white', font=self.font) draw.text((2, cur * 10), ">", fill='white', font=self.font) # Action Events (RIGHT) if action == 1: if type(currentDist[cur][1]) is str: self.pageQue.append(["Action Page Route", -1]) self.cursorHistory.append(cur) self.actionRouter(currentDist[cur][1]) else: self.pageQue.append(currentDist[cur][1]) self.cursorHistory.append(cur) self.renderPage(0, 1) return # Previous Page (Left) if action == -1: if len(self.pageQue) > 1: self.pageQue = self.pageQue[:-1] # Previous Cursor History Recall cur = self.cursorHistory[len(self.cursorHistory) - 1] self.cursorHistory = self.cursorHistory[:-1] return cur displayImage(image) def actionRouter(self, event): # =============Projects Actions =========== if event == "act_Backup_Project_From_OP_1": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": displayPng(workDir + "/Assets/Img/BackupProject.png") time.sleep(0.1) try: tape = OP1Backup() tape.copyToLocal() displayPng(workDir + "/Assets/Img/Done.png") time.sleep(0.1) getAnyKeyEvent() except: print("File Transfer Error") # self.renderPage(-1, 1) if event == "act_Load_Project_From_Local_only_tracks": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": displayPng(workDir + "/Assets/Img/BackupProject.png") time.sleep(0.1) try: tape = OP1Backup() tape.copyOnlyTapesToLocal() displayPng(workDir + "/Assets/Img/Done.png") time.sleep(0.1) getAnyKeyEvent() except: print("File Transfer Error") self.renderPage(-1, 1) if event == "act_Load_Project_From_Local": # rtn = "RETURN" while True: temp = RenderOptionsMenu(getDirFileList(savePaths["Local_Projects"]), "Projects") if temp == "RETURN": break else: rtn = RenderOptionsMenu(["Upload", "Rename", "Delete"]) if rtn == "Upload": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": displayPng(workDir + "/Assets/Img/UploadingProject.png") time.sleep(0.1) try: tape = OP1Backup() tape.loadProjectToOP1(os.path.join(savePaths["Local_Projects"], temp)) except: print("File Transfer Error") elif rtn == "Rename": renderRename(os.path.join(savePaths["Local_Projects"], temp)) elif rtn == "Delete": deleteHelper([os.path.join(savePaths["Local_Projects"], temp)]) elif rtn == "RETURN": pass # ===========Patches Actions=========== if event == "OP1_Synth_Patches": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": renderFolders(config["OP_1_Mounted_Dir"] + "/synth", "Backup", savePaths["Local_Synth"]) if event == "OP1_Drum_Patches": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": renderFolders(config["OP_1_Mounted_Dir"] + "/drum", "Backup", savePaths["Local_Drum"]) if event == "UploadSynthPatches": renderFolders(savePaths["Local_Synth"], "Upload", config["OP_1_Mounted_Dir"] + "/synth") if event == "UploadDrumPatches": renderFolders(savePaths["Local_Drum"], "Upload", config["OP_1_Mounted_Dir"] + "/drum") if event == "act_5_Backup_All_Patches": if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": image = Image.new('1', (128, 64)) image.paste(Image.open(workDir + "/Assets/Img/DownloadPatches.png").convert("1")) displayImage(image) time.sleep(0.1) try: bk = OP1Backup() bk.backupOP1Patches() displayPng(workDir + "/Assets/Img/Done.png") time.sleep(0.1) getAnyKeyEvent() except: print("File Transfer Error") # =================== OP-Z Action Routes ==================== if event == "act_Freeze_State_OPZ": if check_OP_Z_Connection() and config["OP_Z_Mounted_Dir"] != "": displayPng(workDir + "/Assets/Img/BackupProject.png") time.sleep(0.1) try: state = OP1Backup() if state.backupOPZState(): displayPng(workDir + "/Assets/Img/Done.png") time.sleep(0.1) getAnyKeyEvent() except: print("File Transfer Error") # self.renderPage(-1, 1) if event == "act_Recall_State_To_OPZ": # rtn = "RETURN" while True: temp = RenderOptionsMenu(getDirFileList(savePaths["OP_Z_Local_Backup_States_Path"]), "Recall State") if temp == "RETURN": break else: rtn = RenderOptionsMenu(["Upload", "Rename", "Delete"]) if rtn == "Upload": if check_OP_Z_Connection(): displayPng(workDir + "/Assets/Img/UploadingProject.png") time.sleep(0.1) try: state = OP1Backup() print("Recall File: ", os.path.join(savePaths["OP_Z_Local_Backup_States_Path"], temp)) state.loadStateToOPZ(os.path.join(savePaths["OP_Z_Local_Backup_States_Path"], temp)) displayPng(workDir + "/Assets/Img/Done.png") time.sleep(0.1) getAnyKeyEvent() except: print("File Transfer Error") elif rtn == "Rename": renderRename(os.path.join(savePaths["OP_Z_Local_Backup_States_Path"], temp)) elif rtn == "Delete": deleteHelper([os.path.join(savePaths["OP_Z_Local_Backup_States_Path"], temp)]) elif rtn == "RETURN": pass # self.renderPage(-1, 1) if event == "OPZ_Patches": if check_OP_Z_Connection() and config["OP_Z_Mounted_Dir"] != "": renderOPZFolder(config["OP_Z_Mounted_Dir"] + "/samplepacks", "Choose From OP-1 Lib") if event == "MIDI_Host": midi = MidiTool() midi.usbMIDIOut() if event == "OP1FUN_BrowsePacks" or event == "OP1FUN_DownloadAllPacks": Connecting = Image.new('1', (128, 64)) draw = ImageDraw.Draw(Connecting) draw.text((0, 30), "Connecting to Wifi..", font=getFont(), fill='white') # draw.text((5, 35), "WIFI..", font=getFont(), fill='white') displayImage(Connecting) if not internetIsOn(): displayPng(workDir + "/Assets/Img/NoWifi.png") getAnyKeyEvent() noWifiMesg = Image.new('1', (128, 64)) draw = ImageDraw.Draw(noWifiMesg) draw.rectangle([(0, 0), (128, 10)], 'white') draw.text((30, 0), "No Internet", font=getFont(), fill='black') draw.text((5, 15), "Connect to Wifi AP", font=getFont(), fill='white') draw.text((5, 40), "Then assign", font=getFont(), fill='white') draw.text((5, 50), "Available Wifi", font=getFont(), fill='white') displayImage(noWifiMesg) getAnyKeyEvent() else: Connecting = Image.new('1', (128, 64)) draw = ImageDraw.Draw(Connecting) draw.text((0, 30), "Logging into op1.fun", font=getFont(), fill='white') displayImage(Connecting) op = op1funRequests() userAccount = op.getUserAccount() if "" in userAccount: Connecting = Image.new('1', (128, 64)) draw = ImageDraw.Draw(Connecting) draw.text((5, 30), "No Login Info!", font=getFont(), fill='white') displayImage(Connecting) else: packlst = op.getPackList() if event == "OP1FUN_DownloadAllPacks" and packlst: op1FunDownlaodQue(op, packlst, savePaths["Local_Patches"]) elif event == "OP1FUN_BrowsePacks" and packlst: rtn = "" while "RETURN" not in rtn: rtn = RenderOptionsMenu([i[0] for i in packlst], "User:"******"RETURN" not in rtn: actRtn = RenderOptionsMenu(["Download To Local", "Download To OP1"], "Pack: " + rtn) download = [] for i in packlst: name, link = i if name == rtn: download.append((name, link)) if "Download To Local" == actRtn: op1FunDownlaodQue(op, download, savePaths["Local_Patches"]) if "Download To OP1" == actRtn: if check_OP_1_Connection(): op1FunDownlaodQue(op, download, config["OP_1_Mounted_Dir"]) else: break # ===================== Server ================== if event == "Check_IP": import logging logging.basicConfig(level=logging.DEBUG, filename="/home/pi/OP1_File_Organizer/logfile.txt", filemode="a+", format="%(asctime)-15s %(levelname)-8s %(message)s") logging.info("In Check IP") username = "******" IP = "" try: # SSH = SSH_Service() # logging.info("After SSH initialized : ", SSH) # IP = SSH.get_ip_address() IP = get_ip_address() logging.info("Getting the IP Address: ", IP) username = os.getlogin() logging.info("Getting the User Name: ", username) # print(SSH.get_ip_address()) # print(SSH.get_current_connected()) # SSH.start_SSH_Service() IP = IP.replace(".", " . ") IPDisplay = Image.new('1', (128, 64)) draw = ImageDraw.Draw(IPDisplay) draw.rectangle([(0, 0), (128, 10)], 'white') draw.text((50, 0), "SSH IP", font=getFont(), fill='black') draw.text((5, 15), "User : "******"IP : " + IP, font=getFont(), fill='white') draw.text((5, 50), "Password : sys paswd", font=getFont(), fill='white') displayImage(IPDisplay) getAnyKeyEvent() except: IPDisplay = Image.new('1', (128, 64)) draw = ImageDraw.Draw(IPDisplay) draw.rectangle([(0, 0), (128, 10)], 'white') draw.text((50, 0), "SSH IP", font=getFont(), fill='black') draw.text((5, 15), "User : "******"IP : " + IP, font=getFont(), fill='white') draw.text((5, 50), "Password : sys paswd", font=getFont(), fill='white') displayImage(IPDisplay) getAnyKeyEvent() # Display = Image.new('1', (128, 64)) # draw = ImageDraw.Draw(Display) # draw.rectangle([(0, 0), (128, 10)], 'white') # draw.text((5, 25), "Wifi is not ready." + IP, font=getFont(), fill='white') # draw.text((5, 35), "Please try later....." + IP, font=getFont(), fill='white') # displayImage(Display) # getAnyKeyEvent() if event == "Server IP": try: SSH = SSH_Service() IP = SSH.get_ip_address() IPDisplay = Image.new('1', (128, 64)) draw = ImageDraw.Draw(IPDisplay) draw.rectangle([(0, 0), (128, 10)], 'white') draw.text((30, 0), "Browser App", font=getFont(), fill='black') draw.text((0, 15), "Connect To Wifi", font=getFont(), fill='white') draw.text((0, 25), "Open Browser, Then", font=getFont(), fill='white') draw.text((0, 35), "-------------------------------------------------------", font=getSmallFont(), fill='white') draw.text((0, 40), "http://" + IP + ":", font=getFont(), fill='white') draw.text((10, 53), "/5000/files", font=getFont(), fill='white') displayImage(IPDisplay) getAnyKeyEvent() except: pass # ===========Eject Actions=========== if event == "act_ESC_Eject": try: unmounting = Image.new('1', (128, 64)) draw = ImageDraw.Draw(unmounting) draw.text((0, 25), "Ejecting....", font=getFont(), fill='white') displayImage(unmounting) if unmount_OP_1(): time.sleep(1) # unmounted = Image.new('1', (128, 64)) # draw = ImageDraw.Draw(unmounted) # draw.text((0, 25), "Ejected", font=getFont(), fill='white') # displayImage(unmounted) # time.sleep(1) except: pass # ========= POWER OFF ==================== if event == "act_POWER_OFF": image = Image.new('1', (128, 64)) image.paste(Image.open(workDir + "/Assets/Img/PowerOff.png").convert("1")) displayImage(image) time.sleep(1.0) # call("sudo shutdown -h now", shell=True) call("sudo poweroff", shell=True) if event == "checkStorage": image = Image.new('1', (128, 64)) image.paste(Image.open(workDir + "/Assets/Img/Storage_64.png").convert("1")) draw = ImageDraw.Draw(image) if check_OP_1_Connection() and config["OP_1_Mounted_Dir"] != "": sampler, synth, drum = update_Current_Storage_Status() else: sampler, synth, drum = 42, 100, 42 Disk = str(subprocess.check_output("df -h | awk '$NF==\"/\"{printf \"%d/%dGB %s\", $3,$2,$5}'", shell=True)) Disk = Disk.replace("b\'", "") Disk = Disk.replace("\'", "") draw.text((50, 13), str(Disk), font=getFont(), fill="white") # Disk Storage Render draw.text((28, 48), str(config["Max_Synth_Sampler_patches"] - sampler), font=getFont(), fill="white") draw.text((70, 48), str(config["Max_Synth_Synthesis_patches"] - synth), font=getFont(), fill="white") draw.text((112, 48), str(config["Max_Drum_Patches"] - drum), font=getFont(), fill="white") displayImage(image) getAnyKeyEvent() # Press any key to proceed self.renderPage(-1, 1)
def renderFolders(path, upload_download, dest): actualFilePointer = 1 currentCursor = 1 shortArray = [] selectedDisplay = [] fb = fileBrowser(path) # RenderFolders while True: sampler, synth, drum = update_Current_Storage_Status() if "synth" in fb.structCurrentPath( ) or "Synth" in fb.structCurrentPath(): # Display synth and Sample Available availableSlots = config["Max_Synth_Synthesis_patches"] + config[ "Max_Synth_Sampler_patches"] - (synth + sampler) else: availableSlots = config["Max_Drum_Patches"] - drum image = Image.new('1', (128, 64)) image.paste( Image.open(workDir + "/Assets/Img/FileBrowser.png").convert("1")) draw = ImageDraw.Draw(image) draw.text((2, -1), os.path.basename(fb.structCurrentPath()[:-1]), fill='black', font=getFont()) if "synth" in fb.structCurrentPath().lower(): # Display synth and Sample Available draw.text((108, -2), str(availableSlots), fill='white', font=getFont()) else: # Display available drums draw.text((108, -2), str(availableSlots), fill='white', font=getFont()) shortArray = shiftArray(fb.getDirList(), shortArray, 0) clearDisplay() # Empty Folder if not shortArray: draw.text((30, 40), "[Empty]", fill='white', font=getFont()) displayImage(image) time.sleep(2) return counter = 1 for i in shortArray: # Check if current item is selected selected = True if i in selectedDisplay else False # Render the AIF data from cursor landed item if "aif" in i and counter == currentCursor: try: synType, FX, LFO = analyzeAIF( os.path.join(fb.structCurrentPath(), i)) except: # AIF meta data not retrievable synType, FX, LFO = "N/A", "N/A", "N/A" pass # Render Patch Type draw.text((90, 17), str(get_abbreviation(synType)), fill='white', font=getSmallFont()) draw.text((90, 35), str(get_abbreviation(FX)), fill='white', font=getSmallFont()) draw.text((90, 54), str(get_abbreviation(LFO)), fill='white', font=getSmallFont()) # Remove extension for display and dash out long file names i = i.replace(".aif", "") if len(i) > 10: i = i[:10] + ".." # Iterate through selected queue and invert the color if selected: draw.rectangle(((9, counter * 10), (84, counter * 10 + 10)), 'white') draw.text((10, counter * 10), str(i), fill='black', font=getFont()) else: draw.text((10, counter * 10), str(i), fill='white', font=getFont()) # Render next item from current Directory counter += 1 # Render cursor draw.text((0, currentCursor * 10), ">", fill='white', font=getFont()) # Render Scroll Bar scrollBarXLocation = 86 # List Shorter than screen size, fill the whole scroll bar if len(fb.getDirList()) <= 5: draw.line((scrollBarXLocation, 10, scrollBarXLocation, 64), fill="white", width=1) else: scrollBarLength = int(getScrollBarSize(fb.getDirList())) offset = getOffset(fb.getDirList(), actualFilePointer - 1, scrollBarLength) draw.line((scrollBarXLocation, 10 + offset, scrollBarXLocation, 10 + scrollBarLength + offset), fill="white", width=1) # Update Image to the display displayImage(image) key = getKeyStroke() if key == "UP": if currentCursor - 1 < 1: temp = shortArray shortArray = shiftArray(fb.getDirList(), shortArray, -1) if temp != shortArray: actualFilePointer -= 1 else: currentCursor -= 1 actualFilePointer -= 1 if key == "DOWN": if currentCursor + 1 > len(shortArray): temp = shortArray shortArray = shiftArray(fb.getDirList(), shortArray, 1) if temp != shortArray: actualFilePointer += 1 else: currentCursor += 1 actualFilePointer += 1 if key == "LEFT": if len(fb.histQueue) > 1: currentCursor = actualFilePointer = 1 availableSlots += len(fb.getCopyQueue()) selectedDisplay = [] fb.clearCopyQueue() fb.prevPage() else: return if key == "RIGHT": if len(fb.getCopyQueue()) == 0 and "aif" not in fb.getDirList()[ actualFilePointer - 1]: fb.selectNewPath(fb.getDirList()[actualFilePointer - 1]) currentCursor = 1 actualFilePointer = 1 if key == "CENTER": # Start Multi-select. (Select and deselect, and add the selected ones to copy queue) currentFile = fb.getDirList()[actualFilePointer - 1] selectedFolderPath = fb.structCurrentPath() + currentFile # Add to copy if currentFile not in selectedDisplay: # Decrement Available Patches if os.path.isdir(selectedFolderPath): selectedDisplay.append(currentFile) for i in listdir(selectedFolderPath): fb.addToCopyQueue(currentFile + "/" + i) if "media" not in fb.structCurrentPath(): availableSlots -= 1 else: fb.addToCopyQueue(currentFile) selectedDisplay.append(currentFile) if "media" not in fb.structCurrentPath(): availableSlots -= 1 else: # Remove form copy if os.path.isdir(selectedFolderPath): selectedDisplay.remove(currentFile) for i in listdir(selectedFolderPath): fb.removeFromCopyQueue(currentFile + "/" + i) if "media" not in fb.structCurrentPath(): availableSlots += 1 else: fb.removeFromCopyQueue(currentFile) selectedDisplay.remove(currentFile) if "media" not in fb.structCurrentPath(): availableSlots += 1 if key == "A": print("") # return if key == "B": currentFile = fb.getDirList()[actualFilePointer - 1] selectedFolderPath = fb.structCurrentPath() + currentFile fileCount = len(fb.getCopyQueue()) if len(fb.getCopyQueue()) == 0 or len(selectedDisplay) == 1: # Takes case if non of the folder or file is selected if os.path.isdir(selectedFolderPath): for i in listdir(selectedFolderPath): fb.addToCopyQueue(currentFile + "/" + i) fileCount = len(fb.getCopyQueue()) # availableSlots += len(fb.getCopyQueue()) rtn = RenderOptionsMenu([ upload_download + " " + str(fileCount) + " Patches", "Delete " + str(fileCount) + "Patches" ]) else: fb.addToCopyQueue(currentFile) # availableSlots += 1 rtn = RenderOptionsMenu( [upload_download, "Rename", "Delete"]) else: if fileCount == 1: rtn = RenderOptionsMenu( [upload_download, "Rename", "Delete"]) else: rtn = RenderOptionsMenu([ upload_download + " " + str(fileCount) + " Patches", "Delete " + str(fileCount) + "Patches" ]) # if rtn == "RETURN": # availableSlots += fileCount if "Upload" in rtn or "Backup" in rtn: # List allowed if check_OP_1_Connection( ) and config["OP_1_Mounted_Dir"] != "": try: copyQueue = fb.getCopyQueue() if dest == "": dest = config["OP_1_Mounted_Dir"] fileTransferHelper(copyQueue, dest) except: pass elif "Delete" in rtn: # List allowed if check_OP_1_Connection( ) and config["OP_1_Mounted_Dir"] != "": try: deleteHelper(fb.getCopyQueue()) fb.updatePage() except: pass elif "Rename" in rtn: # Only one item is allowed # Rename Page print(fb.getCopyQueue()[0]) renderRename(str(fb.getCopyQueue()[0])) fb.updatePage() # currentCursor = 1 # actualFilePointer = 1 # fb.clearCopyQueue() # selectedDisplay = [] # Update Remain Available Patches Here sampler, synth, drum = update_Current_Storage_Status()