file explorer

Blitz3D Forums/Blitz3D Beginners Area/file explorer

ReadDir() + quads. Use 2d primitive and text drawing commands in place of quads for prototyping.

Here's a primitive example which would need a lot of work:

Type dir_entry
	Field name$
	Field is_dir
End Type

Graphics(800, 600)
SetBuffer(BackBuffer())

path$ = browse("c:")
Cls : Locate 0, 0
Print "The user selected " + path$
Flip
WaitKey
End

Function browse$(dir$)
	init_dir_entries(dir$)

	While Not KeyHit(1)
		Cls : Locate 0, 0
		Text 0, 0, "CURRENT DIR: " + dir$
		count = 0
		For de.dir_entry = Each dir_entry
			If de\is_dir Then
				Text 0, 20 + count*14, "<"+de\name+">"
			Else
				Text 0, 20 + count*14, de\name
			EndIf
			count = count + 1
			If count > 50 Then Exit
		Next

		If MouseHit(1) Then
			line_hit = Floor((MouseY()-20) / 14)
			de_hit.dir_entry = find_dir_entry_by_pos(line_hit)
			If de_hit <> Null Then
				If de_hit\is_dir Then
					dir$ = dir$ + "" + de_hit\name
					init_dir_entries(dir$)
				Else
					Return dir$ + "" + de_hit\name
				EndIf
			EndIf
		EndIf
		
		Flip
	Wend
End Function

Function init_dir_entries(dir$)
	; destroy old entries
	For de.dir_entry = Each dir_entry
		Delete de
	Next

	; create new entries
	current_dir$ = dir$
	dh = ReadDir(dir$)
	While True
		this_file$ = NextFile$(dh)
		If this_file$ = "" Then Exit

		de.dir_entry = New dir_entry
		de\name = this_file$
		If FileType(current_dir$ + "" + de\name) = 2 Then
			de\is_dir = 1
		EndIf
	Wend
End Function

Function find_dir_entry_by_pos.dir_entry(pos)
	de.dir_entry = First dir_entry
	For i = 1 To pos
		de = After de
	Next
	Return de
End Function