Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/src/filesel.c')
-rw-r--r--source/blender/src/filesel.c161
1 files changed, 115 insertions, 46 deletions
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
index bcee676ae90..19c35580ff0 100644
--- a/source/blender/src/filesel.c
+++ b/source/blender/src/filesel.c
@@ -164,7 +164,7 @@ static rcti scrollrct, textrct, bar;
static int filebuty1, filebuty2, page_ofs, collumwidth, selecting=0;
static int filetoname= 0;
static float pixels_to_ofs;
-static char otherdir[FILE_MAXDIR+FILE_MAXFILE];
+static char otherdir[FILE_MAX];
static ScrArea *otherarea;
/* FSMENU HANDLING */
@@ -441,13 +441,13 @@ static int compare_extension(const void *a1, const void *a2) {
}
/* **************************************** */
-
-void clear_global_filesel_vars()
+static int filesel_has_func(SpaceFile *sfile)
{
- selecting= 0;
+ if(sfile->returnfunc || sfile->returnfunc_event || sfile->returnfunc_args)
+ return 1;
+ return 0;
}
-
void filesel_statistics(SpaceFile *sfile, int *totfile, int *selfile, float *totlen, float *sellen)
{
double len;
@@ -497,7 +497,7 @@ void test_flags_file(SpaceFile *sfile)
file->flags |= BLENDERFILE;
if(sfile->type==FILE_LOADLIB) {
- char name[FILE_MAXDIR+FILE_MAXFILE];
+ char name[FILE_MAX];
BLI_strncpy(name, sfile->dir, sizeof(name));
strcat(name, file->relname);
@@ -614,7 +614,7 @@ void sort_filelist(SpaceFile *sfile)
void read_dir(SpaceFile *sfile)
{
int num, len;
- char wdir[FILE_MAXDIR+FILE_MAXFILE];
+ char wdir[FILE_MAX];
/* sfile->act is used for example in databrowse: double names of library objects */
sfile->act= -1;
@@ -675,7 +675,7 @@ void freefilelist(SpaceFile *sfile)
static void split_sfile(SpaceFile *sfile, char *s1)
{
- char string[FILE_MAXDIR+FILE_MAXFILE], dir[FILE_MAXDIR+FILE_MAXFILE], file[FILE_MAXDIR+FILE_MAXFILE];
+ char string[FILE_MAX], dir[FILE_MAX], file[FILE_MAX];
BLI_strncpy(string, s1, sizeof(string));
@@ -699,7 +699,7 @@ void parent(SpaceFile *sfile)
char *dir;
/* if databrowse: no parent */
- if(sfile->type==FILE_MAIN && sfile->returnfunc) return;
+ if(sfile->type==FILE_MAIN && filesel_has_func(sfile)) return;
dir= sfile->dir;
@@ -1135,7 +1135,7 @@ static char *library_string(void)
int nr=0, tot= BLI_countlist(&G.main->library);
if(tot==0) return NULL;
- str= MEM_callocN(tot*(FILE_MAXDIR+FILE_MAXFILE), "filesel lib menu");
+ str= MEM_callocN(tot*(FILE_MAX), "filesel lib menu");
for(tot=0, lib= G.main->library.first; lib; lib= lib->id.next, nr++) {
tot+= sprintf(str+tot, "%s %%x%d|", lib->name+2, nr);
@@ -1181,7 +1181,8 @@ void drawfilespace(ScrArea *sa, void *spacedata)
sprintf(name, "win %d", sa->win);
block= uiNewBlock(&sa->uiblocks, name, UI_EMBOSS, UI_HELV, sa->win);
- uiSetButLock( sfile->type==FILE_MAIN && sfile->returnfunc, NULL);
+ /* browse 1 datablock */
+ uiSetButLock( sfile->type==FILE_MAIN && filesel_has_func(sfile), NULL);
/* space available for load/save buttons? */
loadbutton= MAX2(80, 20+BMF_GetStringWidth(G.font, sfile->title));
@@ -1300,10 +1301,15 @@ static void do_filescrollwheel(SpaceFile *sfile, int move)
}
}
-void activate_fileselect(int type, char *title, char *file, void (*func)(char *))
+/* the complete call; pulldown menu, and three callback types */
+static void activate_fileselect_(int type, char *title, char *file, short *menup, char *pupmenu,
+ void (*func)(char *),
+ void (*func_event)(unsigned short),
+ void (*func_args)(char *, void *arg1, void *arg2),
+ void *arg1, void *arg2)
{
SpaceFile *sfile;
- char group[24], name[FILE_MAXDIR+FILE_MAXFILE], temp[FILE_MAXDIR+FILE_MAXFILE];
+ char group[24], name[FILE_MAX], temp[FILE_MAX];
if(curarea==0) return;
if(curarea->win==0) return;
@@ -1318,10 +1324,21 @@ void activate_fileselect(int type, char *title, char *file, void (*func)(char *)
BLI_strncpy(name, file, sizeof(name));
sfile= curarea->spacedata.first;
- /* sfile wants a (*)(short), but get (*)(char*) */
+
sfile->returnfunc= func;
+ sfile->returnfunc_event= func_event;
+ sfile->returnfunc_args= func_args;
+ sfile->arg1= arg1;
+ sfile->arg2= arg2;
+
sfile->type= type;
sfile->ofs= 0;
+
+ if(sfile->pupmenu)
+ MEM_freeN(sfile->pupmenu);
+ sfile->pupmenu= pupmenu;
+ sfile->menup= menup;
+
/* sfile->act is used for databrowse: double names of library objects */
sfile->act= -1;
@@ -1372,12 +1389,28 @@ void activate_fileselect(int type, char *title, char *file, void (*func)(char *)
filetoname= 1;
}
+void activate_fileselect(int type, char *title, char *file, void (*func)(char *))
+{
+ activate_fileselect_(type, title, file, NULL, NULL, func, NULL, NULL, NULL, NULL);
+}
+
+void activate_fileselect_menu(int type, char *title, char *file, char *pupmenu, short *menup, void (*func)(char *))
+{
+ activate_fileselect_(type, title, file, menup, pupmenu, func, NULL, NULL, NULL, NULL);
+}
+
+void activate_fileselect_args(int type, char *title, char *file, void (*func)(char *, void *, void *), void *arg1, void *arg2)
+{
+ activate_fileselect_(type, title, file, NULL, NULL, NULL, NULL, func, arg1, arg2);
+}
+
+
void activate_imageselect(int type, char *title, char *file, void (*func)(char *))
{
SpaceImaSel *simasel;
- char dir[FILE_MAXDIR+FILE_MAXFILE], name[FILE_MAXDIR+FILE_MAXFILE];
+ char dir[FILE_MAX], name[FILE_MAX];
- if(curarea==0) return;
+ if(curarea==NULL) return;
if(curarea->win==0) return;
newspace(curarea, SPACE_IMASEL);
@@ -1420,19 +1453,47 @@ void activate_databrowse(ID *id, int idcode, int fromcode, int retval, short *me
if(id) BLI_strncpy(str, id->name, sizeof(str));
else return;
- activate_fileselect(FILE_MAIN, "SELECT DATABLOCK", str, (void (*) (char*))func);
+ activate_fileselect_(FILE_MAIN, "SELECT DATABLOCK", str, menup, NULL, NULL, func, NULL, NULL, NULL);
sfile= curarea->spacedata.first;
sfile->retval= retval;
sfile->ipotype= fromcode;
- sfile->menup= menup;
}
-void filesel_prevspace()
+void activate_databrowse_args(struct ID *id, int idcode, int fromcode, short *menup, void (*func)(char *, void *, void *), void *arg1, void *arg2)
{
+ ListBase *lb;
SpaceFile *sfile;
+ char str[32];
+
+ if(id==NULL) {
+ lb= wich_libbase(G.main, idcode);
+ id= lb->first;
+ }
+
+ if(id) BLI_strncpy(str, id->name, sizeof(str));
+ else return;
+
+ activate_fileselect_(FILE_MAIN, "SELECT DATABLOCK", str, menup, NULL, NULL, NULL, func, arg1, arg2);
sfile= curarea->spacedata.first;
+ sfile->ipotype= fromcode;
+}
+
+void filesel_prevspace()
+{
+ SpaceFile *sfile= curarea->spacedata.first;
+
+ /* cleanup */
+ if(sfile->spacetype==SPACE_FILE) {
+ if(sfile->menup)
+ sfile->menup= NULL;
+ if(sfile->pupmenu) {
+ MEM_freeN(sfile->pupmenu);
+ sfile->pupmenu= NULL;
+ }
+ }
+
if(sfile->next) {
BLI_remlink(&curarea->spacedata, sfile);
@@ -1527,11 +1588,11 @@ void free_filesel_spec(char *dir)
}
}
-
+/* NOTE: this is called for file read, after the execfunc no UI memory is valid! */
static void filesel_execute(SpaceFile *sfile)
{
struct direntry *files;
- char name[FILE_MAXDIR+FILE_MAXFILE];
+ char name[FILE_MAX];
int a;
filesel_prevspace();
@@ -1548,7 +1609,7 @@ static void filesel_execute(SpaceFile *sfile)
BIF_undo_push("Append from file");
allqueue(REDRAWALL, 1);
}
- else if(sfile->returnfunc) {
+ else if(filesel_has_func(sfile)) {
fsmenu_insert_entry(sfile->dir, 1);
if(sfile->type==FILE_MAIN) { /* DATABROWSE */
@@ -1593,7 +1654,10 @@ static void filesel_execute(SpaceFile *sfile)
}
}
}
- sfile->returnfunc((char*) (long)sfile->retval);
+ if(sfile->returnfunc_event)
+ sfile->returnfunc_event(sfile->retval);
+ else if(sfile->returnfunc_args)
+ sfile->returnfunc_args(NULL, sfile->arg1, sfile->arg2);
}
else {
if(strncmp(sfile->title, "Save", 4)==0) free_filesel_spec(sfile->dir);
@@ -1604,22 +1668,27 @@ static void filesel_execute(SpaceFile *sfile)
if(sfile->flag & FILE_STRINGCODE) {
if (!G.relbase_valid) {
- okee("You have to save the .blend file before using relative paths! Using absolute path instead.");
- sfile->flag &= ~FILE_STRINGCODE;
+ /* skip save */
+ if(strncmp(sfile->title, "Save", 4)) {
+ okee("You have to save the .blend file before using relative paths! Using absolute path instead.");
+ sfile->flag &= ~FILE_STRINGCODE;
+ }
}
else {
BLI_makestringcode(G.sce, name);
}
}
-
- sfile->returnfunc(name);
+ if(sfile->returnfunc)
+ sfile->returnfunc(name);
+ else if(sfile->returnfunc_args)
+ sfile->returnfunc_args(name, sfile->arg1, sfile->arg2);
}
}
}
static void do_filesel_buttons(short event, SpaceFile *sfile)
{
- char butname[FILE_MAXDIR+FILE_MAXFILE];
+ char butname[FILE_MAX];
if (event == B_FS_FILENAME) {
if (strchr(sfile->file, '*') || strchr(sfile->file, '?') || strchr(sfile->file, '[')) {
@@ -1864,7 +1933,7 @@ static void fs_fake_users(SpaceFile *sfile)
int a;
/* only for F4 DATABROWSE */
- if(sfile->returnfunc) return;
+ if(filesel_has_func(sfile)) return;
for(a=0; a<sfile->totfile; a++) {
if(sfile->filelist[a].flags & ACTIVE) {
@@ -1907,7 +1976,7 @@ void winqreadfilespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
SpaceFile *sfile;
int act, do_draw= 0, i, test, ret = 0;
short qual, mval[2];
- char str[FILE_MAXDIR+FILE_MAXFILE+12];
+ char str[FILE_MAX+12];
sfile= curarea->spacedata.first;
if(sfile==0) return;
@@ -2297,7 +2366,7 @@ static int is_a_library(SpaceFile *sfile, char *dir, char *group)
static void do_library_append(SpaceFile *sfile)
{
Library *lib;
- char dir[FILE_MAXDIR+FILE_MAXFILE], group[32];
+ char dir[FILE_MAX], group[32];
if ( is_a_library(sfile, dir, group)==0 ) {
error("Not a library");
@@ -2344,8 +2413,8 @@ static void library_to_filelist(SpaceFile *sfile)
{
LinkNode *l, *names;
int ok, i, nnames, idcode;
- char filename[FILE_MAXDIR+FILE_MAXFILE];
- char dir[FILE_MAXDIR+FILE_MAXFILE], group[24];
+ char filename[FILE_MAX];
+ char dir[FILE_MAX], group[24];
/* name test */
ok= is_a_library(sfile, dir, group);
@@ -2420,7 +2489,7 @@ static void filesel_select_objects(SpaceFile *sfile)
int a;
/* only when F4 DATABROWSE */
- if(sfile->returnfunc) return;
+ if(filesel_has_func(sfile)) return;
if( strcmp(sfile->dir, "Object/")==0 ) {
for(a=0; a<sfile->totfile; a++) {
@@ -2462,7 +2531,7 @@ static void active_file_object(SpaceFile *sfile)
Object *ob;
/* only when F4 DATABROWSE */
- if(sfile->returnfunc) return;
+ if(filesel_has_func(sfile)) return;
if( strcmp(sfile->dir, "Object/")==0 ) {
if(sfile->act >= 0) {
@@ -2551,7 +2620,7 @@ void main_to_filelist(SpaceFile *sfile)
id= lb->first;
sfile->totfile= 0;
while(id) {
- if(sfile->returnfunc && idcode==ID_IP) {
+ if(filesel_has_func(sfile) && idcode==ID_IP) {
if(sfile->ipotype== ((Ipo *)id)->blocktype) sfile->totfile++;
}
else if (hide==0 || id->name[2] != '.')
@@ -2560,12 +2629,12 @@ void main_to_filelist(SpaceFile *sfile)
id= id->next;
}
- if(sfile->returnfunc==0) sfile->totfile+= 2;
+ if(!filesel_has_func(sfile)) sfile->totfile+= 2;
sfile->filelist= (struct direntry *)malloc(sfile->totfile * sizeof(struct direntry));
files= sfile->filelist;
- if(sfile->returnfunc==0) {
+ if(!filesel_has_func(sfile)) {
memset( &(sfile->filelist[0]), 0 , sizeof(struct direntry));
sfile->filelist[0].relname= BLI_strdup(".");
sfile->filelist[0].type |= S_IFDIR;
@@ -2582,7 +2651,7 @@ void main_to_filelist(SpaceFile *sfile)
while(id) {
ok= 0;
- if(sfile->returnfunc && idcode==ID_IP) {
+ if(filesel_has_func(sfile) && idcode==ID_IP) {
if(sfile->ipotype== ((Ipo *)id)->blocktype) ok= 1;
}
else ok= 1;
@@ -2594,14 +2663,14 @@ void main_to_filelist(SpaceFile *sfile)
if(id->lib==NULL)
files->relname= BLI_strdup(id->name+2);
else {
- char tmp[FILE_MAXDIR+FILE_MAXFILE], fi[FILE_MAXFILE];
- BLI_strncpy(tmp, id->lib->name, FILE_MAXDIR+FILE_MAXFILE);
+ char tmp[FILE_MAX], fi[FILE_MAXFILE];
+ BLI_strncpy(tmp, id->lib->name, FILE_MAX);
BLI_splitdirstring(tmp, fi);
files->relname= MEM_mallocN(FILE_MAXFILE+32, "filename for lib");
sprintf(files->relname, "%s / %s", fi, id->name+2);
}
- if(sfile->returnfunc==0) { /* F4 DATA BROWSE */
+ if(!filesel_has_func(sfile)) { /* F4 DATA BROWSE */
if(idcode==ID_OB) {
if( ((Object *)id)->flag & SELECT) files->flags |= ACTIVE;
}
@@ -2646,7 +2715,7 @@ void main_to_filelist(SpaceFile *sfile)
if( strcmp(sfile->file, sfile->filelist[a].relname)==0) {
sfile->ofs= a-( sfile->collums*(curarea->winy-FILESELHEAD-10)/(2*FILESEL_DY));
filetoname= 0;
- if(sfile->returnfunc) sfile->filelist[a].flags |= ACTIVE;
+ if(filesel_has_func(sfile)) sfile->filelist[a].flags |= ACTIVE;
}
}
}
@@ -2656,9 +2725,9 @@ void main_to_filelist(SpaceFile *sfile)
void clever_numbuts_filesel()
{
SpaceFile *sfile;
- char orgname[FILE_MAXDIR+FILE_MAXFILE+12];
- char filename[FILE_MAXDIR+FILE_MAXFILE+12];
- char newname[FILE_MAXDIR+FILE_MAXFILE+12];
+ char orgname[FILE_MAX+12];
+ char filename[FILE_MAX+12];
+ char newname[FILE_MAX+12];
int test;
int len;