Lua script selector: can now browse directories. Todo: handle double-click.
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1668 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
243c9192c5
commit
f24d4a55bd
@ -2207,6 +2207,15 @@ void Window_redraw_list(T_List_button * list)
|
||||
list->List_start + i,
|
||||
i == list->Cursor_position);
|
||||
}
|
||||
// Remaining rectangle under list
|
||||
i=list->Scroller->Nb_visibles-list->Scroller->Nb_elements;
|
||||
if (i>0)
|
||||
Window_rectangle(
|
||||
list->Entry_button->Pos_X,
|
||||
list->Entry_button->Pos_Y+list->Scroller->Nb_elements*8,
|
||||
list->Entry_button->Width,
|
||||
i*8,
|
||||
MC_Light);
|
||||
}
|
||||
|
||||
//----------------------- Ouverture d'un pop-up -----------------------
|
||||
|
||||
357
src/factory.c
357
src/factory.c
@ -1035,19 +1035,31 @@ int L_FinalizePicture(lua_State* L)
|
||||
}
|
||||
|
||||
// Handlers for window internals
|
||||
T_Fileselector Scripts_list;
|
||||
T_Fileselector Scripts_selector;
|
||||
|
||||
// Callback to display a skin name in the list
|
||||
void Draw_script_name(word x, word y, word index, byte highlighted)
|
||||
{
|
||||
T_Fileselector_item * current_item;
|
||||
|
||||
if (Scripts_list.Nb_elements)
|
||||
if (Scripts_selector.Nb_elements)
|
||||
{
|
||||
current_item = Get_item_by_index(&Scripts_list, index);
|
||||
byte fg, bg;
|
||||
|
||||
current_item = Get_item_by_index(&Scripts_selector, index);
|
||||
|
||||
Print_in_window(x, y, current_item->Short_name, MC_Black,
|
||||
(highlighted)?MC_Dark:MC_Light);
|
||||
if (current_item->Type==1) // Directories
|
||||
{
|
||||
fg=(highlighted)?MC_Black:MC_Dark;
|
||||
bg=(highlighted)?MC_Dark:MC_Light;
|
||||
}
|
||||
else // Files
|
||||
{
|
||||
fg=MC_Black;
|
||||
bg=(highlighted)?MC_Dark:MC_Light;
|
||||
}
|
||||
|
||||
Print_in_window(x, y, current_item->Short_name, fg,bg);
|
||||
|
||||
Update_window_area(x,y,NAME_WIDTH*8,8);
|
||||
}
|
||||
@ -1142,53 +1154,59 @@ void Draw_script_information(T_Fileselector_item * script_item)
|
||||
}
|
||||
|
||||
// Add a script to the list
|
||||
void Add_script(const char *name)
|
||||
void Add_script(const char *name, byte is_file, byte is_directory, byte is_hidden)
|
||||
{
|
||||
const char * file_name;
|
||||
|
||||
// Only files ending in ".lua"
|
||||
int len=strlen(name);
|
||||
if (len<=4 || strcasecmp(name+len-4, ".lua"))
|
||||
return;
|
||||
int len;
|
||||
|
||||
file_name=Find_last_slash(name)+1;
|
||||
Add_element_to_list(&Scripts_list, file_name, Format_filename(file_name, NAME_WIDTH+1, 0), 0, ICON_NONE);
|
||||
|
||||
if (is_file)
|
||||
{
|
||||
// Only files ending in ".lua"
|
||||
len=strlen(file_name);
|
||||
if (len<=4 || strcasecmp(file_name+len-4, ".lua"))
|
||||
return;
|
||||
// Hidden
|
||||
//if (is_hidden && !Config.Show_hidden_files)
|
||||
// return;
|
||||
|
||||
Add_element_to_list(&Scripts_selector, file_name, Format_filename(file_name, NAME_WIDTH+1, 0), 0, ICON_NONE);
|
||||
}
|
||||
else if (is_directory)
|
||||
{
|
||||
// Ignore current directory
|
||||
if ( !strcmp(file_name, "."))
|
||||
return;
|
||||
// Hidden
|
||||
//if (is_hidden && !Config.Show_hidden_directories)
|
||||
// return;
|
||||
|
||||
Add_element_to_list(&Scripts_selector, file_name, Format_filename(file_name, NAME_WIDTH+1, 1), 1, ICON_NONE);
|
||||
}
|
||||
}
|
||||
|
||||
void Highlight_script(T_Fileselector *selector, T_List_button *list, const char *selected_script)
|
||||
void Highlight_script(T_Fileselector *selector, T_List_button *list, const char *selected_file)
|
||||
{
|
||||
short index;
|
||||
|
||||
index=Find_file_in_fileselector(selector, selected_script);
|
||||
|
||||
if ((list->Scroller->Nb_elements<=list->Scroller->Nb_visibles) || (index<list->Scroller->Nb_visibles/2))
|
||||
{
|
||||
list->List_start=0;
|
||||
list->Cursor_position=index;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (index>=list->Scroller->Nb_elements-list->Scroller->Nb_visibles/2)
|
||||
{
|
||||
list->List_start=list->Scroller->Nb_elements-list->Scroller->Nb_visibles;
|
||||
list->Cursor_position=index-list->List_start;
|
||||
}
|
||||
else
|
||||
{
|
||||
list->List_start=index-(list->Scroller->Nb_visibles-1)/2;
|
||||
list->Cursor_position=(list->Scroller->Nb_visibles-1)/2;
|
||||
}
|
||||
}
|
||||
index=Find_file_in_fileselector(selector, selected_file);
|
||||
Locate_list_item(list, selector, index);
|
||||
}
|
||||
|
||||
static char selected_script[MAX_PATH_CHARACTERS]="";
|
||||
static char Last_run_script[MAX_PATH_CHARACTERS]="";
|
||||
|
||||
// Before: Cursor hidden
|
||||
// After: Cursor shown
|
||||
void Run_script(char *scriptdir)
|
||||
void Run_script(const char *script_subdirectory, const char *script_filename)
|
||||
{
|
||||
lua_State* L;
|
||||
const char* message;
|
||||
byte old_cursor_shape=Cursor_shape;
|
||||
char scriptdir[MAX_PATH_CHARACTERS];
|
||||
|
||||
strcpy(scriptdir, Data_directory);
|
||||
strcat(scriptdir, "scripts/");
|
||||
|
||||
// Some scripts are slow
|
||||
Cursor_shape=CURSOR_SHAPE_HOURGLASS;
|
||||
@ -1196,6 +1214,16 @@ void Run_script(char *scriptdir)
|
||||
Flush_update();
|
||||
|
||||
chdir(scriptdir);
|
||||
|
||||
if (script_subdirectory && script_subdirectory[0]!='\0')
|
||||
{
|
||||
sprintf(Last_run_script, "%s%s%s", script_subdirectory, PATH_SEPARATOR, script_filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(Last_run_script, script_filename);
|
||||
}
|
||||
|
||||
|
||||
L = lua_open();
|
||||
putenv("LUA_PATH=libs\\?.lua");
|
||||
@ -1249,8 +1277,6 @@ void Run_script(char *scriptdir)
|
||||
//luaopen_debug(L);
|
||||
*/
|
||||
|
||||
strcat(scriptdir, selected_script);
|
||||
|
||||
// TODO The script may modify the picture, so we do a backup here.
|
||||
// If the script is only touching the brush, this isn't needed...
|
||||
// The backup also allows the script to read from it to make something
|
||||
@ -1275,7 +1301,7 @@ void Run_script(char *scriptdir)
|
||||
{
|
||||
memcpy(Brush_backup, Brush, ((long)Brush_height)*Brush_width);
|
||||
|
||||
if (luaL_loadfile(L,scriptdir) != 0)
|
||||
if (luaL_loadfile(L,Last_run_script) != 0)
|
||||
{
|
||||
int stack_size;
|
||||
stack_size= lua_gettop(L);
|
||||
@ -1335,36 +1361,27 @@ void Run_script(char *scriptdir)
|
||||
|
||||
void Run_numbered_script(byte index)
|
||||
{
|
||||
char scriptdir[MAX_PATH_CHARACTERS];
|
||||
|
||||
if (index>=10)
|
||||
return;
|
||||
if (Bound_script[index]==NULL)
|
||||
return;
|
||||
|
||||
strcpy(scriptdir, Data_directory);
|
||||
strcat(scriptdir, "scripts/");
|
||||
|
||||
strcpy(selected_script, Bound_script[index]);
|
||||
|
||||
Run_script(scriptdir);
|
||||
Hide_cursor();
|
||||
Run_script(NULL, Bound_script[index]);
|
||||
}
|
||||
|
||||
void Repeat_script(void)
|
||||
{
|
||||
char scriptdir[MAX_PATH_CHARACTERS];
|
||||
|
||||
if (selected_script==NULL || selected_script[0]=='\0')
|
||||
if (Last_run_script==NULL || Last_run_script[0]=='\0')
|
||||
{
|
||||
Warning_message("No script to repeat.");
|
||||
return;
|
||||
}
|
||||
|
||||
strcpy(scriptdir, Data_directory);
|
||||
strcat(scriptdir, "scripts/");
|
||||
|
||||
Hide_cursor();
|
||||
Run_script(scriptdir);
|
||||
Run_script(NULL, Last_run_script);
|
||||
}
|
||||
|
||||
void Set_script_shortcut(T_Fileselector_item * script_item)
|
||||
@ -1421,95 +1438,193 @@ void Set_script_shortcut(T_Fileselector_item * script_item)
|
||||
|
||||
void Button_Brush_Factory(void)
|
||||
{
|
||||
static char selected_file[MAX_PATH_CHARACTERS]="";
|
||||
static char sub_directory[MAX_PATH_CHARACTERS]="";
|
||||
|
||||
short clicked_button;
|
||||
T_List_button* scriptlist;
|
||||
T_Scroller_button* scriptscroll;
|
||||
T_Special_button* scriptarea;
|
||||
char scriptdir[MAX_PATH_CHARACTERS];
|
||||
|
||||
Open_window(33+8*NAME_WIDTH, 180, "Brush Factory");
|
||||
|
||||
// Here we use the same data container as the fileselectors.
|
||||
T_Fileselector_item *item;
|
||||
|
||||
// Reinitialize the list
|
||||
Free_fileselector_list(&Scripts_list);
|
||||
Free_fileselector_list(&Scripts_selector);
|
||||
strcpy(scriptdir, Data_directory);
|
||||
strcat(scriptdir, "scripts/");
|
||||
strcat(scriptdir, sub_directory);
|
||||
// Add each found file to the list
|
||||
For_each_file(scriptdir, Add_script);
|
||||
For_each_directory_entry(scriptdir, Add_script);
|
||||
// Sort it
|
||||
Sort_list_of_files(&Scripts_list);
|
||||
Sort_list_of_files(&Scripts_selector);
|
||||
//
|
||||
|
||||
Open_window(33+8*NAME_WIDTH, 180, "Brush Factory");
|
||||
|
||||
Window_set_normal_button(85, 149, 67, 14, "Cancel", 0, 1, KEY_ESC); // 1
|
||||
|
||||
Window_display_frame_in(6, FILESEL_Y - 2, NAME_WIDTH*8+4, 84); // File selector
|
||||
scriptlist = Window_set_list_button(
|
||||
// Fileselector
|
||||
Window_set_special_button(8, FILESEL_Y + 1, NAME_WIDTH*8, 80), // 2
|
||||
// Scroller for the fileselector
|
||||
(scriptscroll = Window_set_scroller_button(NAME_WIDTH*8+14, FILESEL_Y - 1, 82,
|
||||
Scripts_list.Nb_elements,10, 0)), // 3
|
||||
Draw_script_name); // 4
|
||||
// Fileselector
|
||||
scriptarea=Window_set_special_button(8, FILESEL_Y + 1, NAME_WIDTH*8, 80); // 2
|
||||
// Scroller for the fileselector
|
||||
scriptscroll = Window_set_scroller_button(NAME_WIDTH*8+14, FILESEL_Y - 1, 82,
|
||||
Scripts_selector.Nb_elements,10, 0); // 3
|
||||
scriptlist = Window_set_list_button(scriptarea,scriptscroll,Draw_script_name); // 4
|
||||
|
||||
Window_set_normal_button(10, 149, 67, 14, "Run", 0, Scripts_list.Nb_elements!=0, SDLK_RETURN); // 5
|
||||
Window_set_normal_button(10, 149, 67, 14, "Run", 0, 1, SDLK_RETURN); // 5
|
||||
|
||||
Window_display_frame_in(6, FILESEL_Y + 88, DESC_WIDTH*6+4, 4*8+2); // Descr.
|
||||
Window_set_special_button(7, FILESEL_Y + 89+24,DESC_WIDTH*6,8); // 6
|
||||
|
||||
// Update position
|
||||
Highlight_script(&Scripts_list, scriptlist, selected_script);
|
||||
// Update the scroller position
|
||||
scriptscroll->Position=scriptlist->List_start;
|
||||
if (scriptscroll->Position)
|
||||
|
||||
while (1)
|
||||
{
|
||||
// Locate selected file in view
|
||||
Highlight_script(&Scripts_selector, scriptlist, selected_file);
|
||||
// Update the scroller position
|
||||
scriptscroll->Position=scriptlist->List_start;
|
||||
Window_draw_slider(scriptscroll);
|
||||
|
||||
Window_redraw_list(scriptlist);
|
||||
Draw_script_information(Get_item_by_index(&Scripts_list,
|
||||
scriptlist->List_start + scriptlist->Cursor_position));
|
||||
|
||||
Update_window_area(0, 0, Window_width, Window_height);
|
||||
Display_cursor();
|
||||
|
||||
Reset_quicksearch();
|
||||
|
||||
do
|
||||
{
|
||||
clicked_button = Window_clicked_button();
|
||||
if (Is_shortcut(Key,0x100+BUTTON_HELP))
|
||||
Window_help(BUTTON_BRUSH_EFFECTS, "BRUSH FACTORY");
|
||||
else if (Is_shortcut(Key,0x200+BUTTON_BRUSH_EFFECTS))
|
||||
clicked_button=1; // Cancel
|
||||
// Quicksearch
|
||||
if (clicked_button==4)
|
||||
Reset_quicksearch();
|
||||
else if (clicked_button==0 && Key_ANSI)
|
||||
clicked_button=Quicksearch_list(scriptlist, &Scripts_list);
|
||||
|
||||
switch (clicked_button)
|
||||
{
|
||||
case 4:
|
||||
Hide_cursor();
|
||||
Draw_script_information(Get_item_by_index(&Scripts_list,
|
||||
scriptlist->List_start + scriptlist->Cursor_position));
|
||||
Display_cursor();
|
||||
break;
|
||||
|
||||
case 6:
|
||||
Set_script_shortcut(Get_item_by_index(&Scripts_list,
|
||||
scriptlist->List_start + scriptlist->Cursor_position));
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
} while (clicked_button != 1 && clicked_button != 5);
|
||||
Window_redraw_list(scriptlist);
|
||||
Draw_script_information(Get_item_by_index(&Scripts_selector,
|
||||
scriptlist->List_start + scriptlist->Cursor_position));
|
||||
|
||||
Update_window_area(0, 0, Window_width, Window_height);
|
||||
Display_cursor();
|
||||
|
||||
Reset_quicksearch();
|
||||
|
||||
if (clicked_button == 5) // OK
|
||||
{
|
||||
if (Scripts_list.Nb_elements == 0)
|
||||
selected_script[0]='\0';
|
||||
else
|
||||
strcpy(selected_script, Get_item_by_index(&Scripts_list,
|
||||
scriptlist->List_start + scriptlist->Cursor_position)-> Full_name);
|
||||
do
|
||||
{
|
||||
clicked_button = Window_clicked_button();
|
||||
if (Key==SDLK_BACKSPACE && sub_directory[0]!='\0')
|
||||
{
|
||||
// Make it select first entry (parent directory)
|
||||
scriptlist->List_start=0;
|
||||
scriptlist->Cursor_position=0;
|
||||
clicked_button=5;
|
||||
}
|
||||
if (Is_shortcut(Key,0x100+BUTTON_HELP))
|
||||
Window_help(BUTTON_BRUSH_EFFECTS, "BRUSH FACTORY");
|
||||
else if (Is_shortcut(Key,0x200+BUTTON_BRUSH_EFFECTS))
|
||||
clicked_button=1; // Cancel
|
||||
// Quicksearch
|
||||
if (clicked_button==4)
|
||||
Reset_quicksearch();
|
||||
else if (clicked_button==0 && Key_ANSI)
|
||||
clicked_button=Quicksearch_list(scriptlist, &Scripts_selector);
|
||||
|
||||
switch (clicked_button)
|
||||
{
|
||||
case 4:
|
||||
Hide_cursor();
|
||||
Draw_script_information(Get_item_by_index(&Scripts_selector,
|
||||
scriptlist->List_start + scriptlist->Cursor_position));
|
||||
Display_cursor();
|
||||
{
|
||||
// Test double-click
|
||||
static long time_click = 0;
|
||||
static int last_selected_item=-1;
|
||||
static long time_previous;
|
||||
|
||||
time_previous = time_click;
|
||||
time_click = SDL_GetTicks();
|
||||
if (scriptlist->List_start + scriptlist->Cursor_position == last_selected_item)
|
||||
{
|
||||
if (time_click - time_previous < Config.Double_click_speed)
|
||||
clicked_button=5;
|
||||
}
|
||||
else
|
||||
{
|
||||
last_selected_item=scriptlist->List_start + scriptlist->Cursor_position;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 6:
|
||||
Set_script_shortcut(Get_item_by_index(&Scripts_selector,
|
||||
scriptlist->List_start + scriptlist->Cursor_position));
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
} while (clicked_button != 1 && clicked_button != 5);
|
||||
|
||||
// Cancel
|
||||
if (clicked_button==1)
|
||||
break;
|
||||
|
||||
// OK
|
||||
if (Scripts_selector.Nb_elements == 0)
|
||||
{
|
||||
// No items : same as Cancel
|
||||
clicked_button=1;
|
||||
break;
|
||||
}
|
||||
|
||||
// Examine selected file
|
||||
item = Get_item_by_index(&Scripts_selector,
|
||||
scriptlist->List_start + scriptlist->Cursor_position);
|
||||
|
||||
if (item->Type==0) // File
|
||||
{
|
||||
strcpy(selected_file, sub_directory);
|
||||
strcat(selected_file, item->Full_name);
|
||||
break;
|
||||
}
|
||||
else if (item->Type==1) // Directory
|
||||
{
|
||||
if (!strcmp(item->Full_name,PARENT_DIR))
|
||||
{
|
||||
// Going up one directory
|
||||
long len;
|
||||
char * slash_pos;
|
||||
|
||||
// Remove trailing slash
|
||||
len=strlen(sub_directory);
|
||||
if (len && !strcmp(sub_directory+len-1,PATH_SEPARATOR))
|
||||
sub_directory[len-1]='\0';
|
||||
|
||||
slash_pos=Find_last_slash(sub_directory);
|
||||
if (slash_pos)
|
||||
{
|
||||
strcpy(selected_file, slash_pos+1);
|
||||
*slash_pos='\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(selected_file, sub_directory);
|
||||
sub_directory[0]='\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Going down one directory
|
||||
strcpy(selected_file, PARENT_DIR);
|
||||
|
||||
strcat(sub_directory, item->Full_name);
|
||||
strcat(sub_directory, PATH_SEPARATOR);
|
||||
}
|
||||
|
||||
// No break: going back up to beginning of loop
|
||||
|
||||
// Reinitialize the list
|
||||
Free_fileselector_list(&Scripts_selector);
|
||||
strcpy(scriptdir, Data_directory);
|
||||
strcat(scriptdir, "scripts/");
|
||||
strcat(scriptdir, sub_directory);
|
||||
// Add each found file to the list
|
||||
For_each_directory_entry(scriptdir, Add_script);
|
||||
// Sort it
|
||||
Sort_list_of_files(&Scripts_selector);
|
||||
//
|
||||
|
||||
scriptlist->Scroller->Nb_elements=Scripts_selector.Nb_elements;
|
||||
Compute_slider_cursor_length(scriptlist->Scroller);
|
||||
|
||||
Hide_cursor();
|
||||
}
|
||||
}
|
||||
|
||||
Close_window();
|
||||
@ -1517,7 +1632,7 @@ void Button_Brush_Factory(void)
|
||||
|
||||
if (clicked_button == 5) // Run the script
|
||||
{
|
||||
Run_script(scriptdir);
|
||||
Run_script("", selected_file);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -217,6 +217,10 @@ char * Format_filename(const char * fname, word max_length, int type)
|
||||
if (strcmp(fname,PARENT_DIR)==0)
|
||||
{
|
||||
strcpy(result,"<-PARENT DIRECTORY");
|
||||
// Append spaces
|
||||
for (c=18; c<max_length-1; c++)
|
||||
result[c]=' ';
|
||||
result[c]='\0';
|
||||
}
|
||||
else if (fname[0]=='.' || type==1 || type==2)
|
||||
{
|
||||
@ -1159,33 +1163,45 @@ short Quicksearch(T_Fileselector *selector)
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Translated from Highlight_file
|
||||
void Locate_list_item(T_List_button * list, T_Fileselector * selector, short selected_item)
|
||||
{
|
||||
|
||||
// Safety bounds
|
||||
if (selected_item<0)
|
||||
selected_item=0;
|
||||
else if (selected_item>=list->Scroller->Nb_elements)
|
||||
selected_item=list->Scroller->Nb_elements-1;
|
||||
|
||||
|
||||
if ((list->Scroller->Nb_elements<=list->Scroller->Nb_visibles) || (selected_item<(list->Scroller->Nb_visibles/2)))
|
||||
{
|
||||
list->List_start=0;
|
||||
list->Cursor_position=selected_item;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (selected_item>=list->Scroller->Nb_elements-(list->Scroller->Nb_visibles/2))
|
||||
{
|
||||
list->List_start=list->Scroller->Nb_elements-list->Scroller->Nb_visibles;
|
||||
list->Cursor_position=selected_item-list->List_start;
|
||||
}
|
||||
else
|
||||
{
|
||||
list->List_start=selected_item-(list->Scroller->Nb_visibles/2-1);
|
||||
list->Cursor_position=(list->Scroller->Nb_visibles/2-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int Quicksearch_list(T_List_button * list, T_Fileselector * selector)
|
||||
{
|
||||
// Try Quicksearch
|
||||
short selected_item=Quicksearch(selector);
|
||||
if (selected_item>=0 && selected_item!=list->Cursor_position+list->List_start)
|
||||
{
|
||||
// This part translated from Highlight_file()
|
||||
//---
|
||||
if ((list->Scroller->Nb_elements<=list->Scroller->Nb_visibles) || (selected_item<(list->Scroller->Nb_visibles/2)))
|
||||
{
|
||||
list->List_start=0;
|
||||
list->Cursor_position=selected_item;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (selected_item>=list->Scroller->Nb_elements-(list->Scroller->Nb_visibles/2))
|
||||
{
|
||||
list->List_start=list->Scroller->Nb_elements-list->Scroller->Nb_visibles;
|
||||
list->Cursor_position=selected_item-list->List_start;
|
||||
}
|
||||
else
|
||||
{
|
||||
list->List_start=selected_item-(list->Scroller->Nb_visibles/2-1);
|
||||
list->Cursor_position=(list->Scroller->Nb_visibles/2-1);
|
||||
}
|
||||
}
|
||||
//---
|
||||
Locate_list_item(list, selector, selected_item);
|
||||
|
||||
Hide_cursor();
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
|
||||
@ -48,6 +48,8 @@ T_Fileselector_item * Get_item_by_index(T_Fileselector *list, short index);
|
||||
|
||||
short Find_file_in_fileselector(T_Fileselector *list, const char * fname);
|
||||
|
||||
void Locate_list_item(T_List_button * list, T_Fileselector * selector, short selected_item);
|
||||
|
||||
int Quicksearch_list(T_List_button * list, T_Fileselector * selector);
|
||||
|
||||
void Reset_quicksearch(void);
|
||||
|
||||
39
src/io.c
39
src/io.c
@ -32,14 +32,19 @@
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
#if defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__)
|
||||
#include <proto/dos.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#define isHidden(x) (0)
|
||||
#elif defined(__WIN32__)
|
||||
#include <dirent.h>
|
||||
#include <windows.h>
|
||||
//#include <commdlg.h>
|
||||
#define isHidden(x) (GetFileAttributesA((x)->d_name)&FILE_ATTRIBUTE_HIDDEN)
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#define isHidden(x) ((x)->d_name[0]=='.')
|
||||
#endif
|
||||
|
||||
#include "struct.h"
|
||||
@ -276,6 +281,38 @@ void For_each_file(const char * directory_name, void Callback(const char *))
|
||||
closedir(current_directory);
|
||||
}
|
||||
|
||||
/// Scans a directory, calls Callback for each file or directory in it,
|
||||
void For_each_directory_entry(const char * directory_name, void Callback(const char *, byte is_file, byte is_directory, byte is_hidden))
|
||||
{
|
||||
// Pour scan de répertoire
|
||||
DIR* current_directory; //Répertoire courant
|
||||
struct dirent* entry; // Structure de lecture des éléments
|
||||
char full_filename[MAX_PATH_CHARACTERS];
|
||||
int filename_position;
|
||||
strcpy(full_filename, directory_name);
|
||||
current_directory=opendir(directory_name);
|
||||
if(current_directory == NULL) return; // Répertoire invalide ...
|
||||
filename_position = strlen(full_filename);
|
||||
if (filename_position==0 || strcmp(full_filename+filename_position-1,PATH_SEPARATOR))
|
||||
{
|
||||
strcat(full_filename, PATH_SEPARATOR);
|
||||
filename_position = strlen(full_filename);
|
||||
}
|
||||
while ((entry=readdir(current_directory)))
|
||||
{
|
||||
struct stat Infos_enreg;
|
||||
strcpy(&full_filename[filename_position], entry->d_name);
|
||||
stat(full_filename,&Infos_enreg);
|
||||
Callback(
|
||||
full_filename,
|
||||
S_ISREG(Infos_enreg.st_mode),
|
||||
S_ISDIR(Infos_enreg.st_mode),
|
||||
isHidden(entry)?1:0);
|
||||
}
|
||||
closedir(current_directory);
|
||||
}
|
||||
|
||||
|
||||
void Get_full_filename(char * output_name, char * file_name, char * directory_name)
|
||||
{
|
||||
strcpy(output_name,directory_name);
|
||||
|
||||
4
src/io.h
4
src/io.h
@ -90,6 +90,10 @@ int Directory_exists(char * directory);
|
||||
/// Scans a directory, calls Callback for each file in it,
|
||||
void For_each_file(const char * directory_name, void Callback(const char *));
|
||||
|
||||
/// Scans a directory, calls Callback for each file or directory in it,
|
||||
void For_each_directory_entry(const char * directory_name, void Callback(const char *, byte is_file, byte is_directory, byte is_hidden));
|
||||
|
||||
|
||||
///
|
||||
/// Creates a fully qualified name from a directory and filename.
|
||||
/// The point is simply to insert a PATH_SEPARATOR when needed.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user