コード例 #1
0
ファイル: FileBrowser.py プロジェクト: adwuard/OP_Manager
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()
コード例 #2
0
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=""):
        """
コード例 #3
0
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)
コード例 #4
0
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()