Skip to content

Commit a2bcfc2

Browse files
committed
Folder download recursive
1 parent 2fd1b2a commit a2bcfc2

File tree

4 files changed

+39
-31
lines changed

4 files changed

+39
-31
lines changed

index.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ function listFolder(folder) {
2323
}
2424

2525
function getFolderTree(folder_path, result = []) {
26-
console.log('get folder tree', folder_path, result)
2726
fs.readdirSync(folder_path).forEach((file) => {
2827
const fPath = path.resolve(folder_path, file)
2928
const fileStats = { file, path: fPath }
@@ -111,9 +110,8 @@ ipcMain.handle('update-folder', (event, folder) => {
111110
})
112111

113112
ipcMain.handle('remove-folder', (event, folder) => {
114-
const deleteList = getFolderTree(folder)
115113
fs.rmdirSync(folder, { recursive: true, force: true})
116-
console.log('ipcMain', 'remove-folder', folder, deleteList)
114+
console.log('ipcMain', 'remove-folder', folder)
117115
})
118116

119117
ipcMain.handle('remove-file', (event, filePath) => {

preload.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ const Serial = {
5454
return board.fs_rm(file)
5555
},
5656
removeFolder: async (folder) => {
57-
console.log('Board > removeFolder >', folder)
5857
return board.fs_rmdir(folder)
5958
},
6059
saveFileContent: async (filename, content, dataConsumer) => {
@@ -63,7 +62,7 @@ const Serial = {
6362
uploadFile: async (src, dest, dataConsumer) => {
6463
return board.fs_put(src, dest, dataConsumer)
6564
},
66-
downloadFile: async (src, dest) => {
65+
downloadFile: async (src, dest, dataConsumer) => {
6766
let contents = await Serial.loadFile(src)
6867
return ipcRenderer.invoke('save-file', dest, contents)
6968
},
@@ -95,19 +94,16 @@ const Disk = {
9594
return ipcRenderer.invoke('list-files', folder)
9695
},
9796
ilistFiles: async (folder) => {
98-
console.log('dentro ilistFiles', folder)
9997
return ipcRenderer.invoke('ilist-files', folder)
10098
},
10199
loadFile: async (filePath) => {
102100
let content = await ipcRenderer.invoke('load-file', filePath)
103101
return new TextDecoder().decode(content)
104102
},
105103
removeFile: async (filePath) => {
106-
console.log('Disk > removeFile >', filePath)
107104
return ipcRenderer.invoke('remove-file', filePath)
108105
},
109106
removeFolder: async (folderPath) => {
110-
console.log('Disk > removeFolder >', folderPath)
111107
return ipcRenderer.invoke('remove-folder', folderPath)
112108
},
113109
saveFileContent: async (filePath, content) => {

ui/arduino2/main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function App(state, emit) {
2626
if (state.isConnecting) return html`<div id="app"><p>Connecting...</p></div>`
2727
if (state.isLoadingFiles) return html`<div id="app"><p>Loading files...</p></div>`
2828
if (state.isSaving) return html`<div id="app"><p>Saving file... ${state.savingProgress}</p></div>`
29-
if (state.isTransferring) return html`<div id="app"><p>Transferring file... ${state.transferringProgress}</p></div>`
29+
if (state.isTransferring) return html`<div id="app"><p>Transferring file: ${state.transferringProgress}</p></div>`
3030

3131
return state.view == 'editor' ? EditorView(state, emit) : FileManagerView(state, emit)
3232
}

ui/arduino2/store.js

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@ const serial = window.BridgeSerial
33
const disk = window.BridgeDisk
44
const win = window.BridgeWindow
55

6+
function extract(out) {
7+
/*
8+
* Message ($msg) will come out following this template:
9+
* "OK${msg}\x04${err}\x04>"
10+
* TODO: consider error handling
11+
*/
12+
return out.slice(2, -3)
13+
}
14+
615
const newFileContent = `# This program was created in Arduino Lab for MicroPython
716
817
print('Hello, MicroPython!')
@@ -54,12 +63,11 @@ def get_file_tree(path = '.'):
5463
if file_path in ('.', os.getcwd()):
5564
continue
5665
file_name = file_path.split('/')[len(file_path.split('/'))-1]
57-
tree_list.insert(0, (depth, file_path, file_name, is_folder))
66+
tree_list.insert(0, list((depth, file_path, file_name, 'folder' if is_folder else 'file')))
5867
return tree_list
5968
6069
def print_file_tree(path = '.'):
61-
for depth, file_path, file_name, is_folder in get_file_tree(path):
62-
print([file_path, file_name, is_folder])
70+
print(get_file_tree(path))
6371
`
6472
async function store(state, emitter) {
6573
win.setWindowSize(720, 640)
@@ -422,19 +430,10 @@ async function store(state, emitter) {
422430
})
423431
emitter.emit('render')
424432
})
425-
// emitter.on('remove-folder', async () => {
426-
// state.isRemoving = true
427-
// console.log('store > remove-folder')
428-
// emitter.emit('render')
429-
// })
430433
emitter.on('remove-files', async () => {
431434
state.isRemoving = true
432435
emitter.emit('render')
433-
console.log('store > remove-files')
434-
435-
436436
if (state.selectedBoardFiles.length > 0) {
437-
console.log(state.selectedBoardFiles)
438437
const fileNames = state.selectedBoardFiles.filter((f) => f.source === 'board').map((f) => f.fileName)
439438
const confirmBoardDeletion = confirm(`Delete these items from the board?\n ${fileNames.join('\n')}?`, 'Cancel', 'Yes')
440439
if (confirmBoardDeletion) {
@@ -461,7 +460,6 @@ async function store(state, emitter) {
461460
}
462461

463462
if (state.selectedDiskFiles.length > 0) {
464-
console.log(state.selectedDiskFiles)
465463
const fileNames = state.selectedDiskFiles.filter((f) => f.source === 'disk').map((f) => f.fileName)
466464
const confirmDiskDeletion = confirm(`Delete these items from the disk?\n ${fileNames.join('\n')}?`, 'Cancel', 'Yes')
467465
if (confirmDiskDeletion) {
@@ -548,7 +546,6 @@ async function store(state, emitter) {
548546
emitter.on('finish-renaming', () => {})
549547
emitter.on('finish-creating', async (value) => {
550548
if (!state.creatingFile && !state.creatingFolder){
551-
console.log('neither creating file nor folder')
552549
return
553550
}
554551

@@ -609,7 +606,6 @@ async function store(state, emitter) {
609606
emitter.on('close-file-options', () => {})
610607

611608
emitter.on('toggle-file-selection', (file, source, event) => {
612-
console.log(event, file, source)
613609
const isSelected = state.selectedFiles.find((f) => {
614610
return f.fileName === file.fileName && f.source === source
615611
})
@@ -643,10 +639,8 @@ async function store(state, emitter) {
643639
parentFolder: file.parentFolder
644640
})
645641
emitter.emit('open-selected-files')
646-
console.log('open-single-file', file)
647642
})
648643
emitter.on('open-selected-files', async () => {
649-
console.log('open-selected-files')
650644
let files = []
651645
for (let i in state.selectedFiles) {
652646
let selectedFile = state.selectedFiles[i]
@@ -702,7 +696,6 @@ async function store(state, emitter) {
702696
})
703697

704698
if (files.length > 0) {
705-
// console.log(state.openFiles, files)
706699
state.openFiles = state.openFiles.concat(files)
707700
state.editingFile = files[0].id
708701
}
@@ -765,9 +758,31 @@ async function store(state, emitter) {
765758
let command = microPythonFShelpers
766759
command += microPythonFileTree
767760
command += `print_file_tree('${folder_path}')`
768-
const output = await serial.run(command)
769-
console.log(output)
770-
const confirmAction = alert(`Folder transfer not yet available`)
761+
let output = await serial.run(command)
762+
output = extract(output)
763+
output = output.replace(/'/g, '"')
764+
output = output.split('OK')
765+
let files = JSON.parse(output)
766+
for(f in files){
767+
const sourcePath = (files[f][1])
768+
const type = files[f][3]
769+
const sourceRelativePath = sourcePath.split(state.boardNavigationPath)[1]
770+
if(type === 'folder'){
771+
const newFolderPath = disk.getFullPath(state.diskNavigationRoot, state.diskNavigationPath,`/${sourceRelativePath}`)
772+
await disk.createFolder(newFolderPath)
773+
}else{
774+
const fileDestinationPath = disk.getFullPath(state.diskNavigationRoot, state.diskNavigationPath,`/${sourceRelativePath}`)
775+
state.transferringProgress = sourcePath
776+
await serial.downloadFile(
777+
sourcePath,
778+
fileDestinationPath,
779+
(e) => {
780+
state.transferringProgress = e
781+
emitter.emit('render')
782+
})
783+
emitter.emit('render')
784+
}
785+
}
771786
continue
772787
}
773788
await serial.downloadFile(
@@ -1001,7 +1016,6 @@ function canUpload({ isConnected, selectedFiles }) {
10011016
}
10021017

10031018
function deselectFilesFromSource(source, selectedFiles) {
1004-
console.log('deselectFilesFromSource', source, selectedFiles)
10051019
if (selectedFiles.length === 0) return []
10061020
return selectedFiles.filter((f) => f.source !== source)
10071021
}

0 commit comments

Comments
 (0)