repo2/firmware/fileselector.c @ 461
49 | markw | #include "simplefile.h"
|
|
#include "simpledir.h"
|
|||
#include "joystick.h"
|
|||
#include "regs.h" // NO NEED!!!
|
|||
#include "printf.h"
|
|||
#include "fileutils.h"
|
|||
46 | markw | ||
49 | markw | extern int debug_pos; // ARG!
|
|
extern int debug_adjust; // ARG!
|
|||
69 | markw | extern char USER_DIR[];
|
|
46 | markw | ||
49 | markw | // TODO!
|
|
#define MAX_PATH_LENGTH (9*5 + 8+3+1 + 1)
|
|||
46 | markw | ||
55 | markw | int (* filter)(struct SimpleDirEntry * entry);
|
|
int filter_disks(struct SimpleDirEntry * entry)
|
|||
49 | markw | {
|
|
if (dir_is_subdir(entry)) return 1;
|
|||
char const * f = dir_filename(entry);
|
|||
157 | markw | int res = (compare_ext(f,"ATR") || compare_ext(f,"XFD") || compare_ext(f,"XEX"));
|
|
//printf("filter_disks:%s:%d\n",f,res);
|
|||
return res;
|
|||
49 | markw | }
|
|
46 | markw | ||
196 | markw | char const * fil_type;
|
|
char const * fil_type_rom;
|
|||
char const * fil_type_bin;
|
|||
char const * fil_type_car;
|
|||
350 | markw | char const * fil_type_mem;
|
|
195 | markw | int filter_specified(struct SimpleDirEntry * entry)
|
|
55 | markw | {
|
|
if (dir_is_subdir(entry)) return 1;
|
|||
char const * f = dir_filename(entry);
|
|||
195 | markw | return (compare_ext(f,fil_type));
|
|
55 | markw | }
|
|
62 | markw | void dir_of(char * dir, char const * path); // TODO - into simpledir
|
|
55 | markw | ||
49 | markw | void file_selector(struct SimpleFile * file)
|
|
{
|
|||
62 | markw | char dir[MAX_PATH_LENGTH];
|
|
64 | markw | if (file_name(file)[0] == '\0')
|
|
{
|
|||
69 | markw | strcpy(&dir[0],USER_DIR);
|
|
64 | markw | }
|
|
else
|
|||
{
|
|||
dir_of(&dir[0],file_path(file));
|
|||
}
|
|||
262 | markw | ||
struct joystick_status joy;
|
|||
joy.x_ = joy.y_ = joy.fire_ = joy.escape_ = 0;
|
|||
for (;!joy.escape_;)
|
|||
49 | markw | {
|
|
struct SimpleDirEntry * entry = dir_entries_filtered(dir,filter);
|
|||
46 | markw | ||
49 | markw | // Count how many we have
|
|
int entries = 0;
|
|||
struct SimpleDirEntry * temp_entry = entry;
|
|||
while (temp_entry)
|
|||
46 | markw | {
|
|
49 | markw | ++entries;
|
|
temp_entry = dir_next(temp_entry);
|
|||
46 | markw | }
|
|
55 | markw | //printf("Entries:%d\n",entries);
|
|
49 | markw | ||
// Selected item
|
|||
int pos = 0;
|
|||
62 | markw | int prevstartpos = -1;
|
|
49 | markw | ||
for (;;)
|
|||
46 | markw | {
|
|
49 | markw | if (pos<0) pos = 0;
|
|
if (pos>=entries) pos = entries-1;
|
|||
46 | markw | ||
49 | markw | // render
|
|
46 | markw | {
|
|
49 | markw | // find which chunk to render
|
|
52 | markw | int startpos = pos-10;
|
|
//printf("\nA pos:%d, startpos:%d\n",pos,startpos);
|
|||
//startpos &= 0xfffffffe;
|
|||
//printf("startpos:%d\n",startpos);
|
|||
49 | markw | if (startpos<0) startpos=0;
|
|
52 | markw | //printf("pos:%d, startpos:%d\n",pos,startpos);
|
|
49 | markw | ||
// get the dir entries for these
|
|||
struct SimpleDirEntry * render_entry = entry;
|
|||
int skip = startpos;
|
|||
while (skip-->0)
|
|||
46 | markw | {
|
|
49 | markw | render_entry = dir_next(render_entry);
|
|
46 | markw | }
|
|
49 | markw | ||
// clear the screen
|
|||
62 | markw | if (startpos!=prevstartpos)
|
|
{
|
|||
clearscreen();
|
|||
prevstartpos = startpos;
|
|||
}
|
|||
49 | markw | ||
// find selected entry
|
|||
struct SimpleDirEntry * sel_entry = entry;
|
|||
skip = pos;
|
|||
while (skip-->0)
|
|||
46 | markw | {
|
|
49 | markw | sel_entry = dir_next(sel_entry);
|
|
46 | markw | }
|
|
49 | markw | ||
// output the new entries
|
|||
int line;
|
|||
52 | markw | debug_pos = 0;
|
|
55 | markw | debug_adjust = 0;
|
|
printf("Choose ");
|
|||
debug_adjust = 128;
|
|||
printf("file");
|
|||
debug_pos = 40;
|
|||
int end = 22*40;
|
|||
52 | markw | for (;;)
|
|
46 | markw | {
|
|
49 | markw | if (!render_entry) break;
|
|
52 | markw | int prev_debug_pos = debug_pos;
|
|
49 | markw | if (render_entry == sel_entry)
|
|
{
|
|||
debug_adjust = 128;
|
|||
}
|
|||
else
|
|||
{
|
|||
debug_adjust = 0;
|
|||
}
|
|||
if (dir_is_subdir(render_entry))
|
|||
{
|
|||
printf("DIR:");
|
|||
}
|
|||
printf("%s",dir_filename(render_entry));
|
|||
render_entry = dir_next(render_entry);
|
|||
52 | markw | ||
while(prev_debug_pos<debug_pos)
|
|||
{
|
|||
prev_debug_pos+=40;
|
|||
}
|
|||
debug_pos = prev_debug_pos;
|
|||
//printf("debug_pos:%d",debug_pos);
|
|||
if (debug_pos>=end) break;
|
|||
46 | markw | }
|
|
49 | markw | ||
debug_pos = 40*23;
|
|||
if (sel_entry)
|
|||
46 | markw | {
|
|
55 | markw | //printf("%s %s %d %d %d",dir_is_subdir(sel_entry) ? "DIR":"", dir_filename(sel_entry), joy.x_, joy.y_, pos);
|
|
printf("%s %s",dir_is_subdir(sel_entry) ? "DIR":"", dir_filename(sel_entry));
|
|||
46 | markw | }
|
|
62 | markw | int i;
|
|
for (i=0;i!=40;++i) printf(" ");
|
|||
46 | markw | }
|
|
49 | markw | ||
// Slow it down a bit
|
|||
wait_us(100000);
|
|||
// move
|
|||
joystick_wait(&joy,WAIT_QUIET);
|
|||
joystick_wait(&joy,WAIT_EITHER);
|
|||
262 | markw | if (joy.escape_) break;
|
|
49 | markw | ||
if (joy.fire_)
|
|||
46 | markw | {
|
|
49 | markw | int i = pos;
|
|
while(i--)
|
|||
{
|
|||
if (!entry) break;
|
|||
entry = dir_next(entry);
|
|||
}
|
|||
if (entry)
|
|||
{
|
|||
if (!dir_is_subdir(entry))
|
|||
{
|
|||
file_open_dir(entry, file);
|
|||
return;
|
|||
}
|
|||
else
|
|||
{
|
|||
char const *f = dir_filename(entry);
|
|||
if (strcmp("..",f)==0)
|
|||
{
|
|||
int x = strlen(dir);
|
|||
while (x-->0)
|
|||
{
|
|||
if (dir[x] == '/')
|
|||
{
|
|||
dir[x] = '\0';
|
|||
break;
|
|||
}
|
|||
}
|
|||
//printf("\nDIR UP! %s\n",dir);
|
|||
}
|
|||
else
|
|||
{
|
|||
155 | markw | //strcpy(dir + strlen(dir),"/");
|
|
//strcpy(dir + strlen(dir),f);
|
|||
49 | markw | //printf("\nDIR DOWN:%s -> %s\n",f,dir);
|
|
155 | markw | strcpy(dir,dir_path(entry));
|
|
49 | markw | }
|
|
}
|
|||
break;
|
|||
}
|
|||
return;
|
|||
46 | markw | }
|
|
49 | markw | ||
52 | markw | pos += joy.x_*10;
|
|
pos += joy.y_;
|
|||
46 | markw | }
|
|
}
|
|||
262 | markw | ||
joystick_wait(&joy,WAIT_QUIET);
|
|||
46 | markw | }
|