Skip to content

Commit 8c02450

Browse files
committed
Listing folders
1 parent 283c63e commit 8c02450

File tree

4 files changed

+58
-14
lines changed

4 files changed

+58
-14
lines changed

index.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,25 @@ function listFolder(folder) {
2222
return files
2323
}
2424

25+
function ilistFolder(folder, filesOnly) {
26+
let files = fs.readdirSync(path.resolve(folder))
27+
files = files.map(f => {
28+
let filePath = path.resolve(folder, f)
29+
return {
30+
path: f,
31+
type: fs.lstatSync(filePath).isDirectory() ? 'folder' : 'file'
32+
}
33+
})
34+
// Filter out directories
35+
if (filesOnly) {
36+
files = files.filter(f => f.type === 'file')
37+
}
38+
// Filter out dot files
39+
files = files.filter(f => f.path.indexOf('.') !== 0)
40+
return files
41+
}
42+
43+
2544
// LOCAL FILE SYSTEM ACCESS
2645
ipcMain.handle('open-folder', async (event) => {
2746
console.log('ipcMain', 'open-folder')
@@ -39,6 +58,12 @@ ipcMain.handle('list-files', async (event, folder) => {
3958
return listFolder(folder)
4059
})
4160

61+
ipcMain.handle('ilist-files', async (event, folder) => {
62+
console.log('ipcMain', 'ilist-files', folder)
63+
if (!folder) return []
64+
return ilistFolder(folder)
65+
})
66+
4267
ipcMain.handle('load-file', (event, folder, filename) => {
4368
console.log('ipcMain', 'load-file', folder, filename )
4469
let filePath = path.resolve(folder, filename)

preload.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ const Serial = {
4949
board.serial.on('data', fn)
5050
},
5151
listFiles: async () => {
52-
const output = await board.fs_ls()
53-
return output
52+
return await board.fs_ls()
53+
},
54+
ilistFiles: async () => {
55+
return await board.fs_ils()
5456
},
5557
loadFile: async (file) => {
5658
const output = await board.fs_cat(file)
@@ -86,6 +88,9 @@ const Disk = {
8688
listFiles: async (folder) => {
8789
return ipcRenderer.invoke('list-files', folder)
8890
},
91+
ilistFiles: async (folder) => {
92+
return ipcRenderer.invoke('ilist-files', folder)
93+
},
8994
loadFile: async (folder, file) => {
9095
let content = await ipcRenderer.invoke('load-file', folder, file)
9196
return new TextDecoder().decode(content)

ui/arduino/components/panel_files.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
function PanelFiles(state, emit) {
22
function ListItem(device, file) {
33
let selectedClass = ''
4-
if (device === state.selectedDevice && file === state.selectedFile) {
4+
if (device === state.selectedDevice && file.path === state.selectedFile) {
55
selectedClass = 'selected'
66
}
7+
function onClick() {
8+
if (file.type === 'folder') {
9+
console.log('clicked on a folder')
10+
} else {
11+
emit('select-file', device, file.path)
12+
}
13+
}
714
return html`
815
<li
9-
onclick=${() => emit('select-file', device, file)}
16+
onclick=${onClick}
1017
class=${selectedClass}
1118
>
12-
${file}
19+
${file.type === 'folder' ? '📁' : '📄'}
20+
${file.path}
1321
</li>
1422
`
1523
}

ui/arduino/store.js

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ function store(state, emitter) {
6363

6464
if (state.selectedDevice === 'serial') {
6565
state.selectedDevice = 'disk'
66+
state.selectedFile = null
6667
}
6768

6869
emitter.emit('render')
@@ -208,33 +209,38 @@ function store(state, emitter) {
208209
if (state.isConnected) {
209210
await serial.stop()
210211
try {
211-
state.serialFiles = await serial.listFiles()
212-
state.serialFiles = state.serialFiles.filter(
213-
f => f.indexOf('.') !== -1 // Only files with extensions
214-
)
212+
const files = await serial.ilistFiles()
213+
state.serialFiles = files.map(f => ({
214+
path: f[0],
215+
type: f[1] === 0x4000 ? 'folder' : 'file'
216+
}))
215217
// Filter out dot files
216218
state.serialFiles = state.serialFiles.filter(
217-
f => f.indexOf('.') !== 0
219+
f => f.path.indexOf('.') !== 0
218220
)
219221
// Sort alphabetically in case-insensitive fashion
220222
state.serialFiles = state.serialFiles.sort(
221-
(a, b) => a.localeCompare(b)
223+
(a, b) => a.path.localeCompare(b.path)
222224
)
223225
} catch (e) {
226+
state.serialPath = null
227+
state.serialFiles = []
224228
console.log('error', e)
225229
}
226230
}
227231
if (state.diskPath) {
228232
try {
229-
state.diskFiles = await disk.listFiles(state.diskPath)
233+
state.diskFiles = await disk.ilistFiles(state.diskPath)
230234
// Filter out dot files
231-
state.diskFiles = state.diskFiles.filter(f => f.indexOf('.') !== 0)
235+
state.diskFiles = state.diskFiles.filter(f => f.path.indexOf('.') !== 0)
232236
// Sort alphabetically in case-insensitive fashion
233237
state.diskFiles = state.diskFiles.sort(
234-
(a, b) => a.localeCompare(b)
238+
(a, b) => a.path.localeCompare(b.path)
235239
)
236240
} catch (e) {
237241
state.diskPath = null
242+
state.diskFiles = []
243+
localStorage.setItem('diskPath', null)
238244
console.log('error', e)
239245
}
240246
}

0 commit comments

Comments
 (0)