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.c2611
1 files changed, 0 insertions, 2611 deletions
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
deleted file mode 100644
index d4e41e56e75..00000000000
--- a/source/blender/src/filesel.c
+++ /dev/null
@@ -1,2611 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include "MEM_guardedalloc.h"
-
-#include "BMF_Api.h"
-
-#ifdef WIN32
-#include <io.h>
-#include <direct.h>
-#include "BLI_winstuff.h"
-#else
-#include <unistd.h>
-#include <sys/times.h>
-#endif
-
-#include "BLI_blenlib.h"
-#include "BLI_arithb.h"
-#include "BLI_linklist.h"
-#include "BLI_storage_types.h"
-#include "BLI_dynstr.h"
-
-#include "IMB_imbuf.h"
-
-#include "DNA_armature_types.h"
-#include "DNA_action_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_image_types.h"
-#include "DNA_ipo_types.h"
-#include "DNA_material_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_object_types.h"
-#include "DNA_texture_types.h"
-#include "DNA_space_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_vfont_types.h"
-#include "DNA_view3d_types.h"
-
-#include "BKE_action.h"
-#include "BKE_constraint.h"
-#include "BKE_curve.h"
-#include "BKE_depsgraph.h"
-#include "BKE_font.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-#include "BKE_material.h"
-#include "BKE_utildefines.h"
-
-#include "BIF_editview.h"
-#include "BIF_filelist.h"
-#include "BIF_gl.h"
-#include "BIF_interface.h"
-#include "BIF_language.h"
-#include "BIF_mywindow.h"
-#include "BIF_resources.h"
-#include "BIF_space.h"
-#include "BIF_screen.h"
-#include "BIF_toolbox.h"
-#include "BIF_usiblender.h"
-
-#include "BLO_readfile.h"
-
-#include "BDR_editcurve.h"
-#include "BDR_editobject.h"
-
-#include "BPI_script.h"
-#include "BSE_filesel.h"
-#include "BSE_view.h"
-
-#include "mydevice.h"
-#include "blendef.h"
-#include "nla.h"
-
-#include "BIF_fsmenu.h" /* include ourselves */
-
-#ifdef INTERNATIONAL
-#include "FTF_Api.h"
-#endif
-
-#if defined __BeOS
-static int fnmatch(const char *pattern, const char *string, int flags)
-{
- return 0;
-}
-#elif defined WIN32 && !defined _LIBC
- /* use fnmatch included in blenlib */
- #include "BLI_fnmatch.h"
-#else
- #include <fnmatch.h>
-#endif
-
-#ifndef WIN32
-#include <sys/param.h>
-#endif
-
-#define FILESELHEAD 60
-#define FILESEL_DY 16
-
-/* for events */
-#define NOTACTIVE 0
-#define ACTIVATE 1
-#define INACTIVATE 2
-/* for state of file */
-#define ACTIVE 2
-
-#define STARTSWITH(x, y) (strncmp(x, y, sizeof(x) - 1) == 0)
-
-/* button events */
-#define B_FS_FILENAME 1
-#define B_FS_DIRNAME 2
-#define B_FS_DIR_MENU 3
-#define B_FS_PARDIR 4
-#define B_FS_LOAD 5
-#define B_FS_CANCEL 6
-#define B_FS_LIBNAME 7
-
-/* max length of library group name within filesel */
-#define GROUP_MAX 32
-
-static int is_a_library(SpaceFile *sfile, char *dir, char *group);
-static void do_library_append(SpaceFile *sfile);
-static void library_to_filelist(SpaceFile *sfile);
-static void filesel_select_objects(struct SpaceFile *sfile);
-static void active_file_object(struct SpaceFile *sfile);
-static int groupname_to_code(char *group);
-
-extern void countall(void);
-
-/* very bad local globals */
-
-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_MAX];
-static ScrArea *otherarea;
-
-/* ******************* SORT ******************* */
-
-static int compare_name(const void *a1, const void *a2)
-{
- const struct direntry *entry1=a1, *entry2=a2;
-
- /* type is is equal to stat.st_mode */
-
- if (S_ISDIR(entry1->type)){
- if (S_ISDIR(entry2->type)==0) return (-1);
- } else{
- if (S_ISDIR(entry2->type)) return (1);
- }
- if (S_ISREG(entry1->type)){
- if (S_ISREG(entry2->type)==0) return (-1);
- } else{
- if (S_ISREG(entry2->type)) return (1);
- }
- if ((entry1->type & S_IFMT) < (entry2->type & S_IFMT)) return (-1);
- if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
-
- /* make sure "." and ".." are always first */
- if( strcmp(entry1->relname, ".")==0 ) return (-1);
- if( strcmp(entry2->relname, ".")==0 ) return (1);
- if( strcmp(entry1->relname, "..")==0 ) return (-1);
-
- return (BLI_strcasecmp(entry1->relname,entry2->relname));
-}
-
-static int compare_date(const void *a1, const void *a2)
-{
- const struct direntry *entry1=a1, *entry2=a2;
-
- /* type is equal to stat.st_mode */
-
- if (S_ISDIR(entry1->type)){
- if (S_ISDIR(entry2->type)==0) return (-1);
- } else{
- if (S_ISDIR(entry2->type)) return (1);
- }
- if (S_ISREG(entry1->type)){
- if (S_ISREG(entry2->type)==0) return (-1);
- } else{
- if (S_ISREG(entry2->type)) return (1);
- }
- if ((entry1->type & S_IFMT) < (entry2->type & S_IFMT)) return (-1);
- if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
-
- /* make sure "." and ".." are always first */
- if( strcmp(entry1->relname, ".")==0 ) return (-1);
- if( strcmp(entry2->relname, ".")==0 ) return (1);
- if( strcmp(entry1->relname, "..")==0 ) return (-1);
-
- if ( entry1->s.st_mtime < entry2->s.st_mtime) return 1;
- if ( entry1->s.st_mtime > entry2->s.st_mtime) return -1;
-
- else return BLI_strcasecmp(entry1->relname,entry2->relname);
-}
-
-static int compare_size(const void *a1, const void *a2)
-{
- const struct direntry *entry1=a1, *entry2=a2;
-
- /* type is equal to stat.st_mode */
-
- if (S_ISDIR(entry1->type)){
- if (S_ISDIR(entry2->type)==0) return (-1);
- } else{
- if (S_ISDIR(entry2->type)) return (1);
- }
- if (S_ISREG(entry1->type)){
- if (S_ISREG(entry2->type)==0) return (-1);
- } else{
- if (S_ISREG(entry2->type)) return (1);
- }
- if ((entry1->type & S_IFMT) < (entry2->type & S_IFMT)) return (-1);
- if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
-
- /* make sure "." and ".." are always first */
- if( strcmp(entry1->relname, ".")==0 ) return (-1);
- if( strcmp(entry2->relname, ".")==0 ) return (1);
- if( strcmp(entry1->relname, "..")==0 ) return (-1);
-
- if ( entry1->s.st_size < entry2->s.st_size) return 1;
- if ( entry1->s.st_size > entry2->s.st_size) return -1;
- else return BLI_strcasecmp(entry1->relname,entry2->relname);
-}
-
-static int compare_extension(const void *a1, const void *a2) {
- const struct direntry *entry1=a1, *entry2=a2;
- char *sufix1, *sufix2;
- char *nil="";
-
- if (!(sufix1= strstr (entry1->relname, ".blend.gz")))
- sufix1= strrchr (entry1->relname, '.');
- if (!(sufix2= strstr (entry2->relname, ".blend.gz")))
- sufix2= strrchr (entry2->relname, '.');
- if (!sufix1) sufix1= nil;
- if (!sufix2) sufix2= nil;
-
- /* type is is equal to stat.st_mode */
-
- if (S_ISDIR(entry1->type)){
- if (S_ISDIR(entry2->type)==0) return (-1);
- } else{
- if (S_ISDIR(entry2->type)) return (1);
- }
- if (S_ISREG(entry1->type)){
- if (S_ISREG(entry2->type)==0) return (-1);
- } else{
- if (S_ISREG(entry2->type)) return (1);
- }
- if ((entry1->type & S_IFMT) < (entry2->type & S_IFMT)) return (-1);
- if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
-
- /* make sure "." and ".." are always first */
- if( strcmp(entry1->relname, ".")==0 ) return (-1);
- if( strcmp(entry2->relname, ".")==0 ) return (1);
- if( strcmp(entry1->relname, "..")==0 ) return (-1);
- if( strcmp(entry2->relname, "..")==0 ) return (-1);
-
- return (BLI_strcasecmp(sufix1, sufix2));
-}
-
-/* **************************************** */
-static int filesel_has_func(SpaceFile *sfile)
-{
- 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;
- int a;
-
- *totfile= *selfile= 0;
- *totlen= *sellen= 0;
-
- if(sfile->filelist==0) return;
-
- for(a=0; a<sfile->totfile; a++) {
- if( (sfile->filelist[a].type & S_IFDIR)==0 ) {
- (*totfile) ++;
-
- len = sfile->filelist[a].s.st_size;
- (*totlen) += (float)(len/1048576.0);
-
- if(sfile->filelist[a].flags & ACTIVE) {
- (*selfile) ++;
- (*sellen) += (float)(len/1048576.0);
- }
- }
- }
-}
-
-/* *************** HELP FUNCTIONS ******************* */
-
-
-/* not called when browsing .blend itself */
-void test_flags_file(SpaceFile *sfile)
-{
- struct direntry *file;
- int num;
-
- file= sfile->filelist;
-
- for(num=0; num<sfile->totfile; num++, file++) {
- file->flags= 0;
- file->type= file->s.st_mode; /* restore the mess below */
-
- /* Don't check extensions for directories */
- if (file->type & S_IFDIR)
- continue;
-
- if(sfile->type==FILE_BLENDER || sfile->type==FILE_LOADLIB) {
- if(BLO_has_bfile_extension(file->relname)) {
- file->flags |= BLENDERFILE;
-
- if(sfile->type==FILE_LOADLIB) {
- char name[FILE_MAX];
- BLI_strncpy(name, sfile->dir, sizeof(name));
- strcat(name, file->relname);
-
- /* prevent current file being used as acceptable dir */
- if (BLI_streq(G.main->name, name)==0) {
- file->type &= ~S_IFMT;
- file->type |= S_IFDIR;
- }
- }
- }
- } else if (sfile->type==FILE_SPECIAL || sfile->type==FILE_LOADFONT){
- if(BLI_testextensie(file->relname, ".py")) {
- file->flags |= PYSCRIPTFILE;
- } else if( BLI_testextensie(file->relname, ".ttf")
- || BLI_testextensie(file->relname, ".ttc")
- || BLI_testextensie(file->relname, ".pfb")
- || BLI_testextensie(file->relname, ".otf")
- || BLI_testextensie(file->relname, ".otc")) {
- file->flags |= FTFONTFILE;
- } else if (G.have_libtiff &&
- (BLI_testextensie(file->relname, ".tif")
- || BLI_testextensie(file->relname, ".tiff"))) {
- file->flags |= IMAGEFILE;
- } else if (BLI_testextensie(file->relname, ".exr")) {
- file->flags |= IMAGEFILE;
- } else if (G.have_quicktime){
- if( BLI_testextensie(file->relname, ".jpg")
- || BLI_testextensie(file->relname, ".jpeg")
- || BLI_testextensie(file->relname, ".hdr")
- || BLI_testextensie(file->relname, ".exr")
- || BLI_testextensie(file->relname, ".tga")
- || BLI_testextensie(file->relname, ".rgb")
- || BLI_testextensie(file->relname, ".bmp")
- || BLI_testextensie(file->relname, ".png")
-#ifdef WITH_DDS
- || BLI_testextensie(file->relname, ".dds")
-#endif
- || BLI_testextensie(file->relname, ".iff")
- || BLI_testextensie(file->relname, ".lbm")
- || BLI_testextensie(file->relname, ".gif")
- || BLI_testextensie(file->relname, ".psd")
- || BLI_testextensie(file->relname, ".tif")
- || BLI_testextensie(file->relname, ".tiff")
- || BLI_testextensie(file->relname, ".pct")
- || BLI_testextensie(file->relname, ".pict")
- || BLI_testextensie(file->relname, ".pntg") //macpaint
- || BLI_testextensie(file->relname, ".qtif")
- || BLI_testextensie(file->relname, ".cin")
- || BLI_testextensie(file->relname, ".dpx")
- || BLI_testextensie(file->relname, ".sgi")) {
- file->flags |= IMAGEFILE;
- }
- else if(BLI_testextensie(file->relname, ".avi")
- || BLI_testextensie(file->relname, ".flc")
- || BLI_testextensie(file->relname, ".dv")
- || BLI_testextensie(file->relname, ".mov")
- || BLI_testextensie(file->relname, ".movie")
- || BLI_testextensie(file->relname, ".mv")) {
- file->flags |= MOVIEFILE;
- }
- } else { // no quicktime
- if(BLI_testextensie(file->relname, ".jpg")
- || BLI_testextensie(file->relname, ".hdr")
- || BLI_testextensie(file->relname, ".exr")
- || BLI_testextensie(file->relname, ".tga")
- || BLI_testextensie(file->relname, ".rgb")
- || BLI_testextensie(file->relname, ".bmp")
- || BLI_testextensie(file->relname, ".png")
-#ifdef WITH_DDS
- || BLI_testextensie(file->relname, ".dds")
-#endif
- || BLI_testextensie(file->relname, ".iff")
- || BLI_testextensie(file->relname, ".lbm")
- || BLI_testextensie(file->relname, ".cin")
- || BLI_testextensie(file->relname, ".dpx")
- || BLI_testextensie(file->relname, ".sgi")) {
- file->flags |= IMAGEFILE;
- }
- else if(BLI_testextensie(file->relname, ".avi")
- || BLI_testextensie(file->relname, ".mv")) {
- file->flags |= MOVIEFILE;
- }
- else if(BLI_testextensie(file->relname, ".wav")) {
- file->flags |= SOUNDFILE;
- }
- }
- }
- }
-}
-
-
-void sort_filelist(SpaceFile *sfile)
-{
- struct direntry *file;
- int num;/* , act= 0; */
-
- switch(sfile->sort) {
- case FILE_SORTALPHA:
- qsort(sfile->filelist, sfile->totfile, sizeof(struct direntry), compare_name);
- break;
- case FILE_SORTDATE:
- qsort(sfile->filelist, sfile->totfile, sizeof(struct direntry), compare_date);
- break;
- case FILE_SORTSIZE:
- qsort(sfile->filelist, sfile->totfile, sizeof(struct direntry), compare_size);
- break;
- case FILE_SORTEXTENS:
- qsort(sfile->filelist, sfile->totfile, sizeof(struct direntry), compare_extension);
- }
-
- sfile->act= -1;
-
- file= sfile->filelist;
- for(num=0; num<sfile->totfile; num++, file++) {
- file->flags &= ~HILITE;
- }
-
-}
-
-void read_dir(SpaceFile *sfile)
-{
- int num, len;
- char wdir[FILE_MAX];
-
- /* sfile->act is used for example in databrowse: double names of library objects */
- sfile->act= -1;
-
- if(sfile->type==FILE_MAIN) {
- main_to_filelist(sfile);
- return;
- }
- else if(sfile->type==FILE_LOADLIB) {
- library_to_filelist(sfile);
- if(sfile->libfiledata) return;
- }
-
- BLI_hide_dot_files(sfile->flag & FILE_HIDE_DOT);
-
- BLI_getwdN(wdir);
- sfile->totfile= BLI_getdir(sfile->dir, &(sfile->filelist));
- chdir(wdir);
-
- if(sfile->sort!=FILE_SORTALPHA) sort_filelist(sfile);
-
- sfile->maxnamelen= 0;
-
- for (num=0; num<sfile->totfile; num++) {
-
- len = BMF_GetStringWidth(G.font, sfile->filelist[num].relname);
- if (len > sfile->maxnamelen) sfile->maxnamelen = len;
-
- if(filetoname) {
- if(strcmp(sfile->file, sfile->filelist[num].relname)==0) {
-
- sfile->ofs= num-( sfile->collums*(curarea->winy-FILESELHEAD-20)/(2*FILESEL_DY));
- filetoname= 0;
- }
- }
- }
- test_flags_file(sfile);
-
- filetoname= 0;
-}
-
-void freefilelist(SpaceFile *sfile)
-{
- int num;
-
- num= sfile->totfile-1;
-
- if (sfile->filelist==0) return;
-
- for(; num>=0; num--){
- MEM_freeN(sfile->filelist[num].relname);
-
- if (sfile->filelist[num].string) MEM_freeN(sfile->filelist[num].string);
- }
- free(sfile->filelist);
- sfile->filelist= 0;
-}
-
-static void split_sfile(SpaceFile *sfile, char *s1)
-{
- char string[FILE_MAX], dir[FILE_MAX], file[FILE_MAX];
-
- BLI_strncpy(string, s1, sizeof(string));
-
- BLI_split_dirfile(string, dir, file);
-
- if(sfile->filelist) {
- if(strcmp(dir, sfile->dir)!=0) {
- freefilelist(sfile);
- }
- else test_flags_file(sfile);
- }
- BLI_strncpy(sfile->file, file, sizeof(sfile->file));
-
- BLI_make_file_string(G.sce, sfile->dir, dir, "");
-}
-
-
-void parent(SpaceFile *sfile)
-{
- short a;
- char *dir;
-
- /* if databrowse: no parent */
- if(sfile->type==FILE_MAIN && filesel_has_func(sfile)) return;
-
- dir= sfile->dir;
-
-#ifdef WIN32
- if( (a = strlen(dir)) ) { /* remove all '/' at the end */
- while(dir[a-1] == '\\') {
- a--;
- dir[a] = 0;
- if (a<=0) break;
- }
- }
- if( (a = strlen(dir)) ) { /* then remove all until '/' */
- while(dir[a-1] != '\\') {
- a--;
- dir[a] = 0;
- if (a<=0) break;
- }
- }
- if( (a = strlen(dir)) ) {
- if (dir[a-1] != '\\') strcat(dir,"\\");
- }
- else if(sfile->type!=FILE_MAIN) {
- get_default_root(dir);
- }
-#else
- if( (a = strlen(dir)) ) { /* remove all '/' at the end */
- while(dir[a-1] == '/') {
- a--;
- dir[a] = 0;
- if (a<=0) break;
- }
- }
- if( (a = strlen(dir)) ) { /* then remove until '/' */
- while(dir[a-1] != '/') {
- a--;
- dir[a] = 0;
- if (a<=0) break;
- }
- }
- if ( (a = strlen(dir)) ) {
- if (dir[a-1] != '/') strcat(dir,"/");
- }
- else if(sfile->type!=FILE_MAIN) strcpy(dir,"/");
-#endif
-
- /* to be sure */
- BLI_make_exist(sfile->dir);
-
- freefilelist(sfile);
- sfile->ofs= 0;
- scrarea_queue_winredraw(curarea);
-}
-
-void swapselect_file(SpaceFile *sfile)
-{
- struct direntry *file;
- int num, act= 0;
-
- file= sfile->filelist;
- for(num=0; num<sfile->totfile; num++, file++) {
- if(file->flags & ACTIVE) {
- act= 1;
- break;
- }
- }
- file= sfile->filelist+2;
- for(num=2; num<sfile->totfile; num++, file++) {
- if(act) file->flags &= ~ACTIVE;
- else file->flags |= ACTIVE;
- }
-}
-
-static int find_active_file(SpaceFile *sfile, short x, short y)
-{
- int ofs;
-
- if(y > textrct.ymax) y= textrct.ymax;
- if(y <= textrct.ymin) y= textrct.ymin+1;
-
- ofs= (x-textrct.xmin)/collumwidth;
- if(ofs<0) ofs= 0;
- ofs*= (textrct.ymax-textrct.ymin);
-
- return sfile->ofs+ (ofs+textrct.ymax-y)/FILESEL_DY;
-
-}
-
-
-/* ********************** DRAW ******************************* */
-
-static void calc_file_rcts(SpaceFile *sfile)
-{
- int tot, h, len;
- float fac, start, totfile;
-
- scrollrct.xmin= 15;
- scrollrct.xmax= 35;
- scrollrct.ymin= 10;
- scrollrct.ymax= curarea->winy-10-FILESELHEAD;
-
- textrct.xmin= scrollrct.xmax+10;
- textrct.xmax= curarea->winx-10;
- textrct.ymin= scrollrct.ymin;
- textrct.ymax= scrollrct.ymax;
-
- if(textrct.xmax-textrct.xmin <60) textrct.xmax= textrct.xmin+60;
-
- len= (textrct.ymax-textrct.ymin) % FILESEL_DY;
- textrct.ymin+= len;
- scrollrct.ymin+= len;
-
- filebuty1= curarea->winy-FILESELHEAD;
- filebuty2= filebuty1+FILESELHEAD/2 -6;
-
-
- /* amount of collums */
- len= sfile->maxnamelen+25;
-
- if(sfile->type==FILE_MAIN) len+= 100;
- else if(sfile->flag & FILE_SHOWSHORT) len+= 100;
- else len+= 380;
-
- sfile->collums= (textrct.xmax-textrct.xmin)/len;
-
- if(sfile->collums<1) sfile->collums= 1;
- else if(sfile->collums>8) sfile->collums= 8;
-
- /* this flag aint yet defined in user menu, needed? */
-// if((U.flag & USER_FSCOLLUM)==0) sfile->collums= 1;
-
- collumwidth= (textrct.xmax-textrct.xmin)/sfile->collums;
-
-
- totfile= sfile->totfile + 0.5f;
-
- tot= (int)(FILESEL_DY*totfile);
- if(tot) fac= ((float)sfile->collums*(scrollrct.ymax-scrollrct.ymin))/( (float)tot);
- else fac= 1.0;
-
- if(sfile->ofs<0) sfile->ofs= 0;
-
- if(tot) start= ( (float)sfile->ofs)/(totfile);
- else start= 0.0;
- if(fac>1.0) fac= 1.0f;
-
- if(start+fac>1.0) {
- sfile->ofs= (short)ceil((1.0-fac)*totfile);
- start= ( (float)sfile->ofs)/(totfile);
- fac= 1.0f-start;
- }
-
- bar.xmin= scrollrct.xmin+2;
- bar.xmax= scrollrct.xmax-2;
- h= (scrollrct.ymax-scrollrct.ymin)-4;
- bar.ymax= (int)(scrollrct.ymax-2- start*h);
- bar.ymin= (int)(bar.ymax- fac*h);
-
- pixels_to_ofs= (totfile)/(float)(h+3);
- page_ofs= (int)(fac*totfile);
-}
-
-int filescrollselect= 0;
-
-static void draw_filescroll(SpaceFile *sfile)
-{
-
- if(scrollrct.ymin+10 >= scrollrct.ymax) return;
-
- BIF_ThemeColor(TH_BACK);
- glRecti(scrollrct.xmin, scrollrct.ymin, scrollrct.xmax, scrollrct.ymax);
-
- uiEmboss(scrollrct.xmin, scrollrct.ymin, scrollrct.xmax, scrollrct.ymax, 1);
-
- BIF_ThemeColor(TH_HEADER);
- glRecti(bar.xmin+2, bar.ymin+2, bar.xmax-2, bar.ymax-2);
-
- uiEmboss(bar.xmin+2, bar.ymin+2, bar.xmax-2, bar.ymax-2, filescrollselect);
-
-}
-
-static void linerect(int id, int x, int y)
-{
- if(id & ACTIVE) {
- if(id & HILITE) BIF_ThemeColorShade(TH_HILITE, 20);
- else BIF_ThemeColor(TH_HILITE);
- }
- else if(id & HILITE) BIF_ThemeColorShade(TH_BACK, 20);
- else BIF_ThemeColor(TH_BACK);
-
- glRects(x-17, y-3, x+collumwidth-21, y+11);
-
-}
-
-static void print_line(SpaceFile *sfile, struct direntry *files, int x, int y)
-{
- int boxcol=0;
- char *s;
-
- boxcol= files->flags & (HILITE + ACTIVE);
-
- if(boxcol) {
- linerect(boxcol, x, y);
- }
-
- // this is where the little boxes in the file view are being drawn according to the file type
- if(files->flags & BLENDERFILE) {
- cpack(0xA0A0);
- glRects(x-14, y, x-8, y+7);
- }
- else if(files->flags & PSXFILE) {
- cpack(0xA060B0);
- glRects(x-14, y, x-8, y+7);
- }
- else if(files->flags & IMAGEFILE) {
- cpack(0xF08040);
- glRects(x-14, y, x-8, y+7);
- }
- else if(files->flags & MOVIEFILE) {
- cpack(0x70A070);
- glRects(x-14, y, x-8, y+7);
- }
- else if(files->flags & PYSCRIPTFILE) {
- cpack(0x4477dd);
- glRects(x-14, y, x-8, y+7);
- }
- else if(files->flags & SOUNDFILE) {
- cpack(0xa0a000);
- glRects(x-14, y, x-8, y+7);
- }
- else if(files->flags & FTFONTFILE) {
- cpack(0xff2371);
- glRects(x-14, y, x-8, y+7);
- }
-
- if(S_ISDIR(files->type)) BIF_ThemeColor(TH_TEXT_HI);
- else BIF_ThemeColor(TH_TEXT);
-
- s = files->string;
- if(s) {
- glRasterPos2i(x, y);
-#ifdef WITH_ICONV
- {
- struct LANGMenuEntry *lme;
- lme = find_language(U.language);
-
- if ((lme !=NULL) && (!strcmp(lme->code, "ja_JP") ||
- !strcmp(lme->code, "zh_CN")))
- {
- BIF_RasterPos((float)x, (float)y);
-#ifdef WIN32
- BIF_DrawString(G.font, files->relname, ((U.transopts & USER_TR_MENUS) | CONVERT_TO_UTF8));
-#else
- BIF_DrawString(G.font, files->relname, (U.transopts & USER_TR_MENUS));
-#endif
- } else {
- BMF_DrawString(G.font, files->relname);
- }
- }
-#else
- BMF_DrawString(G.font, files->relname);
-#endif /* WITH_ICONV */
-
- x += sfile->maxnamelen + 100;
-
- glRasterPos2i(x - BMF_GetStringWidth(G.font, files->size), y);
- BMF_DrawString(G.font, files->size);
-
- if(sfile->flag & FILE_SHOWSHORT) return;
-
-#ifndef WIN32
- /* rwx rwx rwx */
- x += 20; glRasterPos2i(x, y);
- BMF_DrawString(G.font, files->mode1);
-
- x += 30; glRasterPos2i(x, y);
- BMF_DrawString(G.font, files->mode2);
-
- x += 30; glRasterPos2i(x, y);
- BMF_DrawString(G.font, files->mode3);
-
- /* owner time date */
- x += 30; glRasterPos2i(x, y);
- BMF_DrawString(G.font, files->owner);
-#endif
-
- x += 60; glRasterPos2i(x, y);
- BMF_DrawString(G.font, files->time);
-
- x += 50; glRasterPos2i(x, y);
- BMF_DrawString(G.font, files->date);
- }
- else {
- glRasterPos2i(x, y);
- BMF_DrawString(G.font, files->relname);
-
- if(files->nr) { /* extra info */
- x+= sfile->maxnamelen+20;
- glRasterPos2i(x, y);
- BMF_DrawString(G.font, files->extra);
- }
- }
-}
-
-
-static int calc_filesel_line(SpaceFile *sfile, int nr, int *valx, int *valy)
-{
- /* get screen coordinate of a line */
- int val, coll;
-
- nr-= sfile->ofs;
-
- /* amount of lines */
- val= (textrct.ymax-textrct.ymin)/FILESEL_DY;
- if (val == 0) coll = 0;
- else coll= nr/val;
- nr -= coll*val;
-
- *valy= textrct.ymax-FILESEL_DY+3 - nr*FILESEL_DY;
- *valx= coll*collumwidth + textrct.xmin+20;
-
- if(nr<0 || coll > sfile->collums) return 0;
- return 1;
-}
-
-static void set_active_file(SpaceFile *sfile, int act)
-{
- struct direntry *file;
- int num, redraw= 0;
- unsigned int newflag;
- int old=0, newi=0;
-
- file= sfile->filelist;
- if(file==0) return;
-
- for(num=0; num<sfile->totfile; num++, file++) {
- if(num==act) {
-
- if(selecting && num>1) {
- newflag= HILITE | (file->flags & ~ACTIVE);
- if(selecting==ACTIVATE) newflag |= ACTIVE;
-
- if(file->flags != newflag) redraw|= 1;
- file->flags= newflag;
- }
- else {
- if(file->flags & HILITE);
- else {
- file->flags |= HILITE;
- redraw|= 2;
- newi= num;
- }
- }
- }
- else {
- if(file->flags & HILITE) {
- file->flags &= ~HILITE;
- redraw|= 2;
- old= num;
- }
- }
-
- }
- // removed frontbuffer draw here
- if(redraw) {
- scrarea_queue_winredraw(curarea);
- }
-}
-
-
-static void draw_filetext(SpaceFile *sfile)
-{
- struct direntry *files;
- int a, x, y;
- short mval[2];
-
- if(textrct.ymin+10 >= textrct.ymax) return;
-
-
- /* box */
- BIF_ThemeColor(TH_BACK);
- glRecti(textrct.xmin, textrct.ymin, textrct.xmax, textrct.ymax);
-
- /* collums */
- x= textrct.xmin+collumwidth;
- for(a=1; a<sfile->collums; a++, x+= collumwidth) {
- cpack(0x303030);
- sdrawline(x, textrct.ymin, x, textrct.ymax);
- cpack(0xB0B0B0);
- sdrawline(x+1, textrct.ymin, x+1, textrct.ymax);
- }
-
- if(sfile->filelist==0) return;
-
- /* test: if mouse is not in area: clear HILITE */
- getmouseco_areawin(mval);
-
- if(mval[0]<0 || mval[0]>curarea->winx) {
- files= sfile->filelist+sfile->ofs;
- for(a= sfile->ofs; a<sfile->totfile; a++, files++) files->flags &= ~HILITE;
- }
-
- files= sfile->filelist+sfile->ofs;
- for(a= sfile->ofs; a<sfile->totfile; a++, files++) {
-
- if( calc_filesel_line(sfile, a, &x, &y)==0 ) break;
- print_line(sfile, files, x, y);
- }
-
- /* clear drawing errors, with text at the right hand side: */
- BIF_ThemeColor(TH_HEADER);
- glRecti(textrct.xmax, textrct.ymin, textrct.xmax+10, textrct.ymax);
- uiEmboss(textrct.xmin, textrct.ymin, textrct.xmax, textrct.ymax, 1);
-}
-
-static char *library_string(void)
-{
- Library *lib;
- char *str;
- int nr=0, tot= BLI_countlist(&G.main->library);
-
- if(tot==0) return NULL;
- str= MEM_callocN(tot*(FILE_MAXDIR+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, nr);
- }
- return str;
-}
-
-void drawfilespace(ScrArea *sa, void *spacedata)
-{
- SpaceFile *sfile;
- uiBlock *block;
- float col[3];
- int act, loadbutton;
- short mval[2];
- char name[20];
- char *menu, *strp= NULL;
-
- myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375);
-
- BIF_GetThemeColor3fv(TH_HEADER, col); // basic undrawn color is border
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- sfile= sa->spacedata.first;
- if(sfile->filelist==NULL) {
- read_dir(sfile);
-
- calc_file_rcts(sfile);
-
- /* calculate act */
- getmouseco_areawin(mval);
- act= find_active_file(sfile, mval[0], mval[1]);
- if(act>=0 && act<sfile->totfile)
- sfile->filelist[act].flags |= HILITE;
- }
- else calc_file_rcts(sfile);
-
- /* check if we load library, extra button */
- if(sfile->type==FILE_LOADLIB)
- strp= library_string();
-
- /* HEADER */
- sprintf(name, "win %d", sa->win);
- block= uiNewBlock(&sa->uiblocks, name, UI_EMBOSS, UI_HELV, sa->win);
-
- /* 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));
- if(textrct.xmax-textrct.xmin > loadbutton+20) {
- if(sfile->title[0]==0) loadbutton= 0;
- }
- else loadbutton= 0;
-
- uiBlockBeginAlign(block);
- uiDefBut(block, TEX, B_FS_DIRNAME,"", textrct.xmin + (strp?20:0), filebuty2, textrct.xmax-textrct.xmin-loadbutton - (strp?20:0), 21, sfile->dir, 0.0, (float)FILE_MAXDIR-1, 0, 0, "Directory, enter a directory and press enter to create it"); /* Directory input */
- if(loadbutton) {
- uiSetCurFont(block, UI_HELV);
- uiDefBut(block, BUT, B_FS_LOAD, sfile->title, textrct.xmax-loadbutton, filebuty2, loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
- }
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefBut(block, TEX, B_FS_FILENAME,"", textrct.xmin, filebuty1, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "File, increment version number with (+/-)"); /* File input */
- if(loadbutton) {
- uiSetCurFont(block, UI_HELV);
- uiDefBut(block, BUT, B_FS_CANCEL, "Cancel", textrct.xmax-loadbutton, filebuty1, loadbutton, 21, sfile->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
- }
- uiBlockEndAlign(block);
-
- menu= fsmenu_build_menu();
- if(menu[0]) /* happens when no .Bfs is there, and first time browse */
- uiDefButS(block, MENU, B_FS_DIR_MENU, menu, scrollrct.xmin, filebuty1, scrollrct.xmax-scrollrct.xmin, 21, &sfile->menu, 0, 0, 0, 0, "");
- MEM_freeN(menu);
-
- uiBlockBeginAlign(block);
- uiDefBut(block, BUT, B_FS_PARDIR, "P", scrollrct.xmin, filebuty2, scrollrct.xmax-scrollrct.xmin, 21, 0, 0, 0, 0, 0, "Move to the parent directory (PKEY)");
- if(strp) {
- uiDefIconTextButS(block, MENU, B_FS_LIBNAME, ICON_LIBRARY_DEHLT, strp, scrollrct.xmin+20, filebuty2, scrollrct.xmax-scrollrct.xmin, 21, &sfile->menu, 0, 0, 0, 0, "");
- MEM_freeN(strp);
- }
-
- uiDrawBlock(block);
-
- draw_filescroll(sfile);
- draw_filetext(sfile);
-
- /* others diskfree etc ? */
- scrarea_queue_headredraw(sa);
-
- myortho2(-0.375, (float)(sa->winx)-0.375, -0.375, (float)(sa->winy)-0.375);
- draw_area_emboss(sa);
-
- sa->win_swap= WIN_BACK_OK;
-}
-
-
-static void do_filescroll(SpaceFile *sfile)
-{
- short mval[2], oldy, yo;
-
- calc_file_rcts(sfile);
-
- filescrollselect= 1;
-
- /* for beauty */
- scrarea_do_windraw(curarea);
- screen_swapbuffers();
-
- getmouseco_areawin(mval);
- oldy= yo= mval[1];
-
- while(get_mbut()&L_MOUSE) {
- getmouseco_areawin(mval);
-
- if(yo!=mval[1]) {
- int dy= floor(0.5+((float)(oldy-mval[1]))*pixels_to_ofs);
-
- if(dy) {
- sfile->ofs+= dy;
- if(sfile->ofs<0) {
- sfile->ofs= 0;
- oldy= mval[1];
- }
- else oldy= floor(0.5+ (float)oldy - (float)dy/pixels_to_ofs);
-
- scrarea_do_windraw(curarea);
- screen_swapbuffers();
-
- }
-
- yo= mval[1];
- }
- else BIF_wait_for_statechange();
- }
- filescrollselect= 0;
-
- /* for beauty */
- scrarea_do_windraw(curarea);
- screen_swapbuffers();
-
-}
-
-static void do_filescrollwheel(SpaceFile *sfile, int move)
-{
- // by phase
- int lines, rt;
-
- calc_file_rcts(sfile);
-
- lines = (int)(textrct.ymax-textrct.ymin)/FILESEL_DY;
- rt = lines * sfile->collums;
-
- if(sfile->totfile > rt) {
- sfile->ofs+= move;
- if( sfile->ofs + rt > sfile->totfile + 1)
- sfile->ofs = sfile->totfile - rt + 1;
- }
-
- if(sfile->ofs<0) {
- sfile->ofs= 0;
- }
-}
-
-/* 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[GROUP_MAX], name[FILE_MAX], temp[FILE_MAX];
-
- if(curarea==0) return;
- if(curarea->win==0) return;
-
- newspace(curarea, SPACE_FILE);
- scrarea_queue_winredraw(curarea);
-
- /* sometime double, when area already is SPACE_FILE with a different file name */
- if(curarea->headwin) addqueue(curarea->headwin, CHANGED, 1);
-
- name[2]= 0;
- BLI_strncpy(name, file, sizeof(name));
-
- sfile= curarea->spacedata.first;
-
- 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;
-
- if(G.relbase_valid && BLI_convertstringcode(name, G.sce, G.scene->r.cfra))
- sfile->flag |= FILE_STRINGCODE;
- else
- sfile->flag &= ~FILE_STRINGCODE;
-
- if (U.uiflag & USER_HIDE_DOT)
- sfile->flag |= FILE_HIDE_DOT;
-
- if(type==FILE_MAIN) {
- char *groupname;
-
- BLI_strncpy(sfile->file, name+2, sizeof(sfile->file));
-
- groupname = BLO_idcode_to_name( GS(name) );
- if (groupname) {
- BLI_strncpy(sfile->dir, groupname, sizeof(sfile->dir) - 1);
- strcat(sfile->dir, "/");
- }
-
- /* free all */
- if(sfile->libfiledata) BLO_blendhandle_close(sfile->libfiledata);
- sfile->libfiledata= 0;
-
- freefilelist(sfile);
- }
- else if(type==FILE_LOADLIB) {
- BLI_strncpy(sfile->dir, name, sizeof(sfile->dir));
- if( is_a_library(sfile, temp, group) ) {
- /* force a reload of the library-filelist */
- freefilelist(sfile);
- }
- else {
- split_sfile(sfile, name);
- if(sfile->libfiledata) BLO_blendhandle_close(sfile->libfiledata);
- sfile->libfiledata= NULL;
- }
- }
- else { /* FILE_BLENDER or FILE_LOADFONT */
- split_sfile(sfile, name); /* test filelist too */
- BLI_cleanup_dir(G.sce, sfile->dir);
-
- /* free: filelist and libfiledata became incorrect */
- if(sfile->libfiledata) BLO_blendhandle_close(sfile->libfiledata);
- sfile->libfiledata= 0;
- }
- BLI_strncpy(sfile->title, title, sizeof(sfile->title));
- 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_databrowse(ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short))
-{
- 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, func, NULL, NULL, NULL);
-
- sfile= curarea->spacedata.first;
- sfile->retval= retval;
- sfile->ipotype= fromcode;
-}
-
-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->pupmenu) {
- MEM_freeN(sfile->pupmenu);
- sfile->pupmenu= NULL;
- }
- }
-
- if(sfile->next) {
-
- BLI_remlink(&curarea->spacedata, sfile);
- BLI_addtail(&curarea->spacedata, sfile);
-
- sfile= curarea->spacedata.first;
-
- if (sfile->spacetype == SPACE_SCRIPT) {
- SpaceScript *sc = (SpaceScript *)sfile;
- if (sc->script) sc->script->flags &=~SCRIPT_FILESEL;
- }
-
- newspace(curarea, sfile->spacetype);
- }
- else newspace(curarea, SPACE_INFO);
-}
-
-static int countselect(SpaceFile *sfile)
-{
- int a, count=0;
-
- for(a=0; a<sfile->totfile; a++) {
- if(sfile->filelist[a].flags & ACTIVE) {
- count++;
- }
- }
- return count;
-}
-
-static int getotherdir(void)
-{
- ScrArea *sa;
- SpaceFile *sfile=0;
-
- sa= G.curscreen->areabase.first;
- while(sa) {
- if(sa!=curarea) {
- if(sa->spacetype==SPACE_FILE) {
-
- /* already found one */
- if(sfile) return 0;
-
- sfile= sa->spacedata.first;
-
- if(sfile->type & FILE_UNIX) {
- otherarea= sa;
- BLI_make_file_string(G.sce, otherdir, sfile->dir, "");
- }
- else sfile= 0;
- }
- }
- sa= sa->next;
- }
- if(sfile) return 1;
- return 0;
-}
-
-static void reread_other_fs(void)
-{
- SpaceFile *sfile;
-
- /* watch it: only call when getotherdir returned OK */
-
- sfile= otherarea->spacedata.first;
- freefilelist(sfile);
- scrarea_queue_winredraw(otherarea);
-}
-
-
-void free_filesel_spec(char *dir)
-{
- /* all filesels with 'dir' are freed */
- bScreen *sc;
-
- sc= G.main->screen.first;
- while(sc) {
- ScrArea *sa= sc->areabase.first;
- while(sa) {
- SpaceLink *sl= sa->spacedata.first;
- while(sl) {
- if(sl->spacetype==SPACE_FILE) {
- SpaceFile *sfile= (SpaceFile*) sl;
- if (BLI_streq(sfile->dir, dir)) {
- freefilelist(sfile);
- }
- }
- sl= sl->next;
- }
- sa= sa->next;
- }
- sc= sc->id.next;
- }
-}
-
-/* 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_MAX];
- int a;
-
- filesel_prevspace();
-
- if(sfile->type==FILE_LOADLIB) {
- 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;
- }
- }
-
- do_library_append(sfile);
- BIF_undo_push("Append from file");
- allqueue(REDRAWALL, 1);
- }
- else if(filesel_has_func(sfile)) {
- fsmenu_insert_entry(sfile->dir, 1, 0);
-
- if(sfile->type==FILE_MAIN) { /* DATABROWSE */
- if (sfile->menup) { /* with value pointing to ID block index */
- int notfound = 1;
-
- /* Need special handling since hiding .* datablocks means that
- sfile->act is no longer the same as files->nr.
-
- Also, toggle HIDE_DOT on and off can make sfile->act not longer
- correct (meaning it doesn't point to the correct item in the filelist.
-
- sfile->file is always correct, so first with check if, for the item
- corresponding to sfile->act, the name is the same.
-
- If it isn't (or if sfile->act is not good), go over filelist and take
- the correct one.
-
- This means that selecting a datablock than hiding it makes it
- unselectable. Not really a problem.
-
- - theeth
- */
-
- *sfile->menup= -1;
-
- if(sfile->act>=0) {
- if(sfile->filelist) {
- files= sfile->filelist+sfile->act;
- if ( strcmp(files->relname, sfile->file)==0) {
- notfound = 0;
- *sfile->menup= files->nr;
- }
- }
- }
- if (notfound) {
- for(a=0; a<sfile->totfile; a++) {
- if( strcmp(sfile->filelist[a].relname, sfile->file)==0) {
- *sfile->menup= sfile->filelist[a].nr;
- break;
- }
- }
- }
- }
- 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);
- if(strncmp(sfile->title, "Export", 6)==0) free_filesel_spec(sfile->dir);
-
- BLI_strncpy(name, sfile->dir, sizeof(name));
- strcat(name, sfile->file);
-
- if(sfile->flag & FILE_STRINGCODE) {
- /* still weak, but we don't want saving files to make relative paths */
- if(G.relbase_valid && strncmp(sfile->title, "Save", 4)) {
- BLI_makestringcode(G.sce, name);
- } else {
- /* if we don't have a valid relative base (.blend file hasn't been saved yet)
- then we don't save the path as relative (for texture images, background image).
- Warning message not shown when saving files (doesn't make sense there)
- */
- if (strncmp(sfile->title, "Save", 4)) {
- printf("Relative path setting has been ignored because .blend file hasn't been saved yet.\n");
- }
- sfile->flag &= ~FILE_STRINGCODE;
- }
- }
- 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_MAX];
-
- if (event == B_FS_FILENAME) {
- if (strchr(sfile->file, '*') || strchr(sfile->file, '?') || strchr(sfile->file, '[')) {
- int i, match = FALSE;
-
- for (i = 2; i < sfile->totfile; i++) {
- if (fnmatch(sfile->file, sfile->filelist[i].relname, 0) == 0) {
- sfile->filelist[i].flags |= ACTIVE;
- match = TRUE;
- }
- }
- if (match) sfile->file[0] = '\0';
- if(sfile->type==FILE_MAIN) filesel_select_objects(sfile);
- scrarea_queue_winredraw(curarea);
- }
- }
- else if(event== B_FS_DIRNAME) {
- /* reuse the butname variable */
- BLI_cleanup_dir(G.sce, sfile->dir);
-
- BLI_make_file_string(G.sce, butname, sfile->dir, "");
- BLI_strncpy(sfile->dir, butname, sizeof(sfile->dir));
-
- /* strip the trailing slash if its a real dir */
- if (strlen(butname)!=1)
- butname[strlen(butname)-1]=0;
-
- if(sfile->type & FILE_UNIX) {
- if (!BLI_exists(butname)) {
- if (okee("Makedir")) {
- BLI_recurdir_fileops(butname);
- if (!BLI_exists(butname)) parent(sfile);
- } else parent(sfile);
- }
- }
- freefilelist(sfile);
- sfile->ofs= 0;
- scrarea_queue_winredraw(curarea);
- }
- else if(event== B_FS_DIR_MENU) {
- char *selected= fsmenu_get_entry(sfile->menu-1);
-
- /* which string */
- if (selected) {
- BLI_strncpy(sfile->dir, selected, sizeof(sfile->dir));
- BLI_make_exist(sfile->dir);
- BLI_cleanup_dir(G.sce, sfile->dir);
- freefilelist(sfile);
- sfile->ofs= 0;
- scrarea_queue_winredraw(curarea);
- }
-
- sfile->act= -1;
-
- }
- else if(event== B_FS_PARDIR)
- parent(sfile);
- else if(event== B_FS_LOAD) {
- if(sfile->type)
- filesel_execute(sfile);
- }
- else if(event== B_FS_CANCEL)
- filesel_prevspace();
- else if(event== B_FS_LIBNAME) {
- Library *lib= BLI_findlink(&G.main->library, sfile->menu);
- if(lib) {
- BLI_strncpy(sfile->dir, lib->filename, sizeof(sfile->dir));
- BLI_make_exist(sfile->dir);
- BLI_cleanup_dir(G.sce, sfile->dir);
- freefilelist(sfile);
- sfile->ofs= 0;
- scrarea_queue_winredraw(curarea);
- sfile->act= -1;
- }
- }
-
-}
-
-/****/
-
-typedef void (*ReplaceFP)(ID *oldblock, ID *newblock);
-
-static void change_id_link(void *linkpv, void *newlinkv) {
- ID **linkp= (ID**) linkpv;
- ID *newlink= newlinkv;
-
- if (*linkp) {
- (*linkp)->us--;
- }
- (*linkp)= newlink;
- if (newlink) {
- id_us_plus(newlink);
- }
-}
-
-static void replace_image(ID *oldblock, ID *newblock) {
- Image *oldima= (Image*) oldblock;
- Image *newima= (Image*) newblock;
- bScreen *sc;
- Scene *sce;
- Tex *tex;
- Mesh *me;
-
- for (tex= G.main->tex.first; tex; tex= tex->id.next) {
- if (tex->env && tex->env->type == ENV_LOAD && tex->env->ima == oldima)
- change_id_link(&tex->env->ima, newima);
- if (tex->ima == oldima)
- change_id_link(&tex->ima, newima);
- }
-
- for (sce= G.main->scene.first; sce; sce= sce->id.next) {
- if (sce->ima == oldima)
- change_id_link(&sce->ima, newima);
- }
-
- for (sc= G.main->screen.first; sc; sc= sc->id.next) {
- ScrArea *sa;
-
- for (sa= sc->areabase.first; sa; sa= sa->next) {
- SpaceLink *sl;
-
- for (sl= sa->spacedata.first; sl; sl= sl->next) {
- if (sl->spacetype == SPACE_VIEW3D) {
- View3D *v3d= (View3D*) sl;
- BGpic *bgp= v3d->bgpic;
-
- if (bgp && bgp->ima == oldima)
- change_id_link(&bgp->ima, newima);
- } else if (sl->spacetype == SPACE_IMAGE) {
- SpaceImage *sima= (SpaceImage*) sl;
-
- if (sima->image == oldima)
- change_id_link(&sima->image, newima);
- }
- }
- }
- }
-
- for (me= G.main->mesh.first; me; me= me->id.next) {
- int i, a;
- MTFace *tface;
-
- for(i=0; i<me->fdata.totlayer; i++) {
- if(me->fdata.layers[i].type == CD_MTFACE) {
- tface= (MTFace*)me->fdata.layers[i].data;
-
- for (a=0; a<me->totface; a++, tface++) {
- if (tface->tpage == oldima) {
- /* not change_id_link, tpage's aren't owners :(
- * see hack below.
- */
- tface->tpage= newima;
- }
- }
- }
- }
- }
-
- /* Nasty hack, necessary because tpages don't act
- * as a user, so there lots of image user count
- * munging occurs... this will ensure the image
- * really dies.
- */
- oldima->id.us= 0;
-}
-
-static void replace_material(ID *oldblock, ID *newblock)
-{
- Material *old= (Material*) oldblock;
- Material *new= (Material*) newblock;
- Material ***matarar;
- ID *id;
- Object *ob;
- int a;
-
- ob= G.main->object.first;
- while(ob) {
- if(ob->totcol && ob->id.lib==0) {
- matarar= give_matarar(ob);
- for(a=1; a<=ob->totcol; a++) {
- if(ob->mat[a-1] == old) {
- if(old) old->id.us--;
- id_us_plus((ID *)new);
- ob->mat[a-1]= new;
- }
- id= ob->data;
- if( (*matarar)[a-1] == old && id->lib==0) {
- if(old) old->id.us--;
- id_us_plus((ID *)new);
- (*matarar)[a-1]= new;
- }
- }
- }
- ob= ob->id.next;
- }
-}
-
-static ReplaceFP get_id_replace_function(int idcode) {
- switch (idcode) {
- case ID_MA:
- return &replace_material;
- case ID_IM:
- return &replace_image;
- default:
- return NULL;
- }
-}
-
-static void databrowse_replace(SpaceFile *sfile, int idcode)
-{
- ReplaceFP replace_func= get_id_replace_function(idcode);
-
- if (!replace_func) {
- error("Replacing %s blocks is unsupported", BLO_idcode_to_name(idcode));
- } else if (sfile->act==-1) {
- error("Select target with leftmouse");
- } else {
- ID *target= (ID*) sfile->filelist[sfile->act].poin;
-
- if (target) {
- char buf[128];
-
- sprintf(buf, "Replace with %s: %s", BLO_idcode_to_name(idcode), target->name+2);
-
- if (okee(buf)) {
- int i;
-
- for (i = 0; i <sfile->totfile; i++)
- if ((sfile->filelist[i].flags&ACTIVE) && sfile->filelist[i].poin!=target)
- replace_func(sfile->filelist[i].poin, target);
- }
- }
- }
-
- freefilelist(sfile);
- scrarea_queue_winredraw(curarea);
-}
-
-static void fs_fake_users(SpaceFile *sfile)
-{
- ID *id;
- int a;
-
- /* only for F4 DATABROWSE */
- if(filesel_has_func(sfile)) return;
-
- for(a=0; a<sfile->totfile; a++) {
- if(sfile->filelist[a].flags & ACTIVE) {
- id= (ID *)sfile->filelist[a].poin;
- if(id) {
- if( id->flag & LIB_FAKEUSER) {
- id->flag -= LIB_FAKEUSER;
- id->us--;
- }
- else {
- id->flag |= LIB_FAKEUSER;
- id->us++;
- }
- }
- }
- }
- freefilelist(sfile);
- scrarea_queue_winredraw(curarea);
-}
-
-
-static int get_hilited_entry(SpaceFile *sfile)
-{
- int a;
-
- for(a=0; a<sfile->totfile; a++) {
- if(sfile->filelist[a].flags & HILITE) {
- return a;
- }
- }
- return -1;
-}
-
-
-void winqreadfilespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
-{
- unsigned short event= evt->event;
- short val= evt->val;
- static int acto=0;
- SpaceFile *sfile;
- int act, do_draw= 0, i, test, ret = 0;
- short qual, mval[2];
- char str[FILE_MAX+12];
-
- sfile= curarea->spacedata.first;
- if(sfile==0) return;
- if(sfile->filelist==0) {
- return;
- }
-
- if(curarea->win==0) return;
- calc_file_rcts(sfile);
- getmouseco_areawin(mval);
-
- /* prevent looping */
- if(selecting && !(get_mbut() & R_MOUSE)) selecting= 0;
-
- if(val) {
-
- if( event!=RETKEY && event!=PADENTER)
- if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
-
- switch(event) {
-
- case UI_BUT_EVENT:
- do_filesel_buttons(val, sfile);
- break;
-
- case WHEELDOWNMOUSE:
- do_filescrollwheel(sfile, U.wheellinescroll);
- act= find_active_file(sfile, mval[0], mval[1]);
- set_active_file(sfile, act);
- do_draw= 1;
- break;
- case WHEELUPMOUSE:
- do_filescrollwheel(sfile, -U.wheellinescroll);
- act= find_active_file(sfile, mval[0], mval[1]);
- set_active_file(sfile, act);
- do_draw= 1;
- break;
-
- case LEFTMOUSE:
- case MIDDLEMOUSE:
- if(mval[0]>scrollrct.xmin && mval[0]<scrollrct.xmax && mval[1]>scrollrct.ymin && mval[1]<scrollrct.ymax) {
- do_filescroll(sfile);
- }
- else if(mval[0]>textrct.xmin && mval[0]<textrct.xmax && mval[1]>textrct.ymin && mval[1]<textrct.ymax) {
-
- /* sfile->act is used in databrowse: double names of library objects */
-
- sfile->act= act= find_active_file(sfile, mval[0], mval[1]);
-
- if(act>=0 && act<sfile->totfile) {
- if(S_ISDIR(sfile->filelist[act].type)) {
- /* the path is too long and we are not going up! */
- if (strcmp(sfile->filelist[act].relname, ".") &&
- strcmp(sfile->filelist[act].relname, "..") &&
- strlen(sfile->dir) + strlen(sfile->filelist[act].relname) >= FILE_MAXDIR )
- {
- error("Path too long, cannot enter this directory");
- } else {
- strcat(sfile->dir, sfile->filelist[act].relname);
- strcat(sfile->dir,"/");
- BLI_cleanup_dir(G.sce, sfile->dir);
- freefilelist(sfile);
- sfile->ofs= 0;
- do_draw= 1;
- }
- }
- else {
- if( strcmp(sfile->file, sfile->filelist[act].relname)) {
- char tmpstr[240];
- do_draw= 1;
- BLI_strncpy(sfile->file, sfile->filelist[act].relname, sizeof(sfile->file));
- if (sfile->f_fp) {
- sprintf (tmpstr, "%s%s", sfile->dir, sfile->file);
- /* printf ("%s\n", tmpstr); */
- #ifdef INTERNATIONAL
- if (!FTF_GetNewFont ((const unsigned char *)tmpstr, 0, U.fontsize))
- error ("No font file");
- #endif
- }
- }
- if(event==MIDDLEMOUSE && sfile->type) filesel_execute(sfile);
- }
- }
- }
- break;
- case RIGHTMOUSE:
- act= find_active_file(sfile, mval[0], mval[1]);
- acto= act;
- if(act>=0 && act<sfile->totfile) {
-
- if (sfile->filelist[act].flags & ACTIVE) {
- sfile->filelist[act].flags &= ~ACTIVE;
- selecting = INACTIVATE;
- }
- else {
- test= sfile->filelist[act].relname[0];
- if (act>=2 || test!='.') sfile->filelist[act].flags |= ACTIVE;
-
- selecting = ACTIVATE;
- }
- do_draw= 1;
- }
- break;
- case MOUSEY:
- act= find_active_file(sfile, mval[0], mval[1]);
- if (act!=acto) {
- set_active_file(sfile, act);
- }
- if(selecting && act!=acto) {
-
- while(1) {
- if (acto >= 2 && acto < sfile->totfile) {
- if (selecting == ACTIVATE) sfile->filelist[acto].flags |= ACTIVE;
- else if (selecting == INACTIVATE) sfile->filelist[acto].flags &= ~ACTIVE;
- }
- if (acto < act) acto++;
- else if (acto > act) acto--;
- else break;
-
- }
-
- }
- acto= act;
- break;
-
- case PAGEUPKEY:
- sfile->ofs-= page_ofs;
- do_draw= 1;
- break;
- case PAGEDOWNKEY:
- sfile->ofs+= page_ofs;
- do_draw= 1;
- break;
- case HOMEKEY:
- sfile->ofs= 0;
- do_draw= 1;
- break;
- case ENDKEY:
- sfile->ofs= sfile->totfile;
- do_draw= 1;
- break;
-
- case AKEY:
- swapselect_file(sfile);
- if(sfile->type==FILE_MAIN) filesel_select_objects(sfile);
- do_draw= 1;
- break;
-
- case BKEY:
- case CKEY:
- case LKEY:
- if(event==LKEY && sfile->type==FILE_MAIN && (G.qual & LR_CTRLKEY)) {
- databrowse_replace(sfile, groupname_to_code(sfile->dir));
- break;
- }
- /* pass */
- case MKEY:
- if(sfile->type==FILE_MAIN) break;
-
- if(!countselect(sfile)) {
- error("No files selected");
- break;
- }
-
- if(!getotherdir()) {
- error("No second fileselect");
- break;
- }
-
- if (!strcmp(sfile->dir, otherdir)) {
- error("Same directories");
- break;
- }
-
- if(event==BKEY) sprintf(str, "Backup to %s", otherdir);
- else if(event==CKEY) sprintf(str, "Copy to %s", otherdir);
- else if(event==LKEY) sprintf(str, "Linked copy to %s", otherdir);
- else if(event==MKEY) sprintf(str, "Move to %s", otherdir);
-
- if (!okee(str)) break;
-
- for (i = 0; i<sfile->totfile; i++){
- if (sfile->filelist[i].flags & ACTIVE) {
- BLI_make_file_string(G.sce, str, sfile->dir, sfile->filelist[i].relname);
-
- if(event==BKEY) ret= BLI_backup(sfile->filelist[i].relname, sfile->dir, otherdir);
- else if(event==CKEY) ret= BLI_copy_fileops(str, otherdir);
- else if(event==LKEY) ret= BLI_link(str, otherdir);
- else if(event==MKEY) ret= BLI_move(str, otherdir);
-
- if (ret) {error("Command failed, see console"); break;}
- else sfile->filelist[i].flags &= ~ACTIVE;
- }
- }
- do_draw= 1;
- if(event==BKEY || event==MKEY)
- freefilelist(sfile);
-
- reread_other_fs();
-
- break;
-
- case XKEY:
- test = get_hilited_entry(sfile);
-
- if (test != -1 && !(S_ISDIR(sfile->filelist[test].type))){
- BLI_make_file_string(G.sce, str, sfile->dir, sfile->filelist[test].relname);
-
- if( okee("Remove %s", str) ) {
- ret = BLI_delete(str, 0, 0);
- if (ret) {
- error("Command failed, see console");
- } else {
- freefilelist(sfile);
- do_draw= 1;
- }
- }
- }
- break;
-
- case RKEY:
- if(sfile->type==FILE_MAIN) {
- databrowse_replace(sfile, groupname_to_code(sfile->dir));
- break;
- }
- /* pass to TKEY! */
-
- case TKEY:
- if(sfile->type==FILE_MAIN) break;
-
- if(!countselect(sfile)) {
- error("No files selected");
- break;
- }
-
- if(event==TKEY) sprintf(str, "Touch");
- else if(event==RKEY) sprintf(str, "Remove from %s", sfile->dir);
-
- qual= G.qual; /* because after okee() you released the SHIFT */
- if (!okee(str)) break;
-
- for (i = 0; i <sfile->totfile; i++) {
- if (sfile->filelist[i].flags & ACTIVE) {
- BLI_make_file_string(G.sce, str, sfile->dir, sfile->filelist[i].relname);
-
- if(event==TKEY) ret= BLI_touch(str);
- else if(event==RKEY) {
- if(qual & LR_SHIFTKEY) ret= BLI_delete(str, 0, 1);
- else if(S_ISDIR(sfile->filelist[i].type)) ret= BLI_delete(str, 1, 0);
- else ret= BLI_delete(str, 0, 0);
- }
-
- if (ret) {error("Command failed, see console"); break;}
- else sfile->filelist[i].flags &= ~ACTIVE;
- }
- }
- do_draw= 1;
- freefilelist(sfile);
-
- break;
-
- case PKEY:
- if(G.qual & LR_SHIFTKEY) {
- extern char bprogname[]; /* usiblender.c */
-#ifdef WIN32
- sprintf(str, "%s -a \"%s%s\"", bprogname, sfile->dir, sfile->file);
-#else
- sprintf(str, "\"%s\" -a \"%s%s\"", bprogname, sfile->dir, sfile->file);
-#endif
- system(str);
- }
- else
- parent(sfile);
-
- break;
-
- case IKEY:
- if(sfile->type==FILE_MAIN) break;
-
- sprintf(str, "$IMAGEEDITOR %s%s", sfile->dir, sfile->file);
- system(str);
- break;
-
- case EKEY:
- if(sfile->type==FILE_MAIN) break;
-
- sprintf(str, "$WINEDITOR %s%s", sfile->dir, sfile->file);
- system(str);
- break;
-
- case FKEY:
- if(sfile->type==FILE_MAIN) {
- fs_fake_users(sfile);
- }
- break;
-
- case PADPLUSKEY:
- case EQUALKEY:
- if (G.qual & LR_CTRLKEY) BLI_newname(sfile->file, +100);
- else if (G.qual & LR_SHIFTKEY) BLI_newname(sfile->file, +10);
- else BLI_newname(sfile->file, +1);
-
- do_draw= 1;
- break;
-
- case PADMINUS:
- case MINUSKEY:
- if (G.qual & LR_CTRLKEY) BLI_newname(sfile->file, -100);
- else if (G.qual & LR_SHIFTKEY) BLI_newname(sfile->file, -10);
- else BLI_newname(sfile->file, -1);
-
- do_draw= 1;
- break;
-
- case BACKSLASHKEY:
- case SLASHKEY:
- if(sfile->type==FILE_MAIN) break;
-
-#ifdef WIN32
- BLI_strncpy(sfile->dir, "\\", sizeof(sfile->dir));
-#else
- BLI_strncpy(sfile->dir, "/", sizeof(sfile->dir));
-#endif
- freefilelist(sfile);
- sfile->ofs= 0;
- do_draw= 1;
- break;
- case PERIODKEY:
- freefilelist(sfile);
- do_draw= 1;
- break;
- case ESCKEY:
- filesel_prevspace();
- break;
- case PADENTER:
- case RETKEY:
- if(sfile->type) filesel_execute(sfile);
- break;
- }
- }
- else if(event==RIGHTMOUSE) {
- selecting = NOTACTIVE;
- if(sfile->type==FILE_MAIN) filesel_select_objects(sfile);
- }
- else if(event==LEFTMOUSE) {
- if(sfile->type==FILE_MAIN) active_file_object(sfile);
- }
-
- /* XXX, stupid patch, curarea can become undone
- * because of file loading... fixme zr
- */
- if(do_draw && curarea) scrarea_queue_winredraw(curarea);
-}
-
-
-
-
-/* ************* LIBRARY FILESEL ******************* */
-
-static int groupname_to_code(char *group)
-{
- char buf[GROUP_MAX];
- char *lslash;
-
- BLI_strncpy(buf, group, GROUP_MAX);
- lslash= BLI_last_slash(buf);
- if (lslash)
- lslash[0]= '\0';
-
- return BLO_idcode_from_name(buf);
-}
-
-static int is_a_library(SpaceFile *sfile, char *dir, char *group)
-{
- /* return ok when a blenderfile, in dir is the filename,
- * in group the type of libdata
- */
- int len;
- char *fd;
-
- strcpy(dir, sfile->dir);
- len= strlen(dir);
- if(len<7) return 0;
- if( dir[len-1] != '/' && dir[len-1] != '\\') return 0;
-
- group[0]= 0;
- dir[len-1]= 0;
-
- /* Find the last slash */
- fd= (strrchr(dir, '/')>strrchr(dir, '\\'))?strrchr(dir, '/'):strrchr(dir, '\\');
-
- if(fd==0) return 0;
- *fd= 0;
- if(BLO_has_bfile_extension(fd+1)) {
- /* the last part of the dir is a .blend file, no group follows */
- *fd= '/'; /* put back the removed slash separating the dir and the .blend file name */
- }
- else {
- char *gp = fd+1; // in case we have a .blend file, gp points to the group
-
- /* Find the last slash */
- fd= (strrchr(dir, '/')>strrchr(dir, '\\'))?strrchr(dir, '/'):strrchr(dir, '\\');
- if (!fd || !BLO_has_bfile_extension(fd+1)) return 0;
-
- /* now we know that we are in a blend file and it is safe to
- assume that gp actually points to a group */
- if (BLI_streq("Screen", gp)==0)
- BLI_strncpy(group, gp, GROUP_MAX);
- }
- return 1;
-}
-
-static void do_library_append(SpaceFile *sfile)
-{
- Library *lib;
- char dir[FILE_MAX], group[GROUP_MAX];
-
- if ( is_a_library(sfile, dir, group)==0 ) {
- error("Not a library");
- } else if (!sfile->libfiledata) {
- error("Library not loaded");
- } else if (group[0]==0) {
- error("Nothing indicated");
- } else if (BLI_streq(G.main->name, dir)) {
- error("Cannot use current file as library");
- } else {
- Object *ob;
- int idcode = groupname_to_code(group);
-
- if((sfile->flag & FILE_LINK)==0)
- /* tag everything, all untagged data can be made local */
- flag_all_listbases_ids(LIB_APPEND_TAG, 1);
-
- BLO_library_append(sfile, dir, idcode);
-
- /* DISPLISTS? */
- ob= G.main->object.first;
- while(ob) {
- if(ob->id.lib) {
- ob->recalc |= OB_RECALC;
- }
- ob= ob->id.next;
- }
-
- /* and now find the latest append lib file */
- lib= G.main->library.first;
- while(lib) {
- if (BLI_streq(dir, lib->filename)) break;
- lib= lib->id.next;
- }
-
- /* make local */
- if(lib && (sfile->flag & FILE_LINK)==0) {
- all_local(lib, 1);
- /* important we unset, otherwise these object wont
- * link into other scenes from this blend file */
- flag_all_listbases_ids(LIB_APPEND_TAG, 0);
- }
-
- DAG_scene_sort(G.scene);
-
- /* in sfile->dir is the whole lib name */
- BLI_strncpy(G.lib, sfile->dir, sizeof(G.lib) );
- }
-}
-
-static void library_to_filelist(SpaceFile *sfile)
-{
- LinkNode *l, *names;
- int ok, i, nnames, idcode;
- char filename[FILE_MAX];
- char dir[FILE_MAX], group[GROUP_MAX];
-
- /* name test */
- ok= is_a_library(sfile, dir, group);
- if (!ok) {
- /* free */
- if(sfile->libfiledata) BLO_blendhandle_close(sfile->libfiledata);
- sfile->libfiledata= 0;
- return;
- }
-
- BLI_strncpy(filename, G.sce, sizeof(filename)); // G.sce = last file loaded, for UI
-
- /* there we go */
- /* for the time being only read filedata when libfiledata==0 */
- if (sfile->libfiledata==0) {
- sfile->libfiledata= BLO_blendhandle_from_file(dir); // this sets G.sce, we dont want it
-
- if(sfile->libfiledata==0) return;
- }
-
- idcode= groupname_to_code(group);
-
- // memory for strings is passed into filelist[i].relname
- // and free'd in freefilelist
- if (idcode) {
- names= BLO_blendhandle_get_datablock_names(sfile->libfiledata, idcode);
- } else {
- names= BLO_blendhandle_get_linkable_groups(sfile->libfiledata);
- }
-
- nnames= BLI_linklist_length(names);
-
- sfile->totfile= nnames + 2;
- sfile->filelist= malloc(sfile->totfile * sizeof(*sfile->filelist));
- memset(sfile->filelist, 0, sfile->totfile * sizeof(*sfile->filelist));
-
- sfile->filelist[0].relname= BLI_strdup(".");
- sfile->filelist[0].type |= S_IFDIR;
- sfile->filelist[1].relname= BLI_strdup("..");
- sfile->filelist[1].type |= S_IFDIR;
-
- for (i=0, l= names; i<nnames; i++, l= l->next) {
- char *blockname= BLI_strdup(l->link);
-
- sfile->filelist[i + 2].relname= blockname;
- if (!idcode)
- sfile->filelist[i + 2].type |= S_IFDIR;
- }
-
- BLI_linklist_free(names, free);
-
- qsort(sfile->filelist, sfile->totfile, sizeof(struct direntry), compare_name);
-
- sfile->maxnamelen= 0;
- for(i=0; i<sfile->totfile; i++) {
- int len = BMF_GetStringWidth(G.font, sfile->filelist[i].relname);
- if (len > sfile->maxnamelen)
- sfile->maxnamelen = len;
- }
-
- BLI_strncpy(G.sce, filename, sizeof(filename)); // prevent G.sce to change
-
-}
-
-/* ******************* DATA SELECT ********************* */
-
-static void filesel_select_objects(SpaceFile *sfile)
-{
- Object *ob;
- Base *base;
- Scene *sce;
- int a;
-
- /* only when F4 DATABROWSE */
- if(filesel_has_func(sfile)) return;
-
- if( strcmp(sfile->dir, "Object/")==0 ) {
- for(a=0; a<sfile->totfile; a++) {
-
- ob= (Object *)sfile->filelist[a].poin;
-
- if(ob && (ob->flag & OB_RESTRICT_VIEW)==0) {
- if(sfile->filelist[a].flags & ACTIVE) ob->flag |= SELECT;
- else ob->flag &= ~SELECT;
- }
-
- }
- base= FIRSTBASE;
- while(base) {
- base->flag= base->object->flag;
- base= base->next;
- }
- countall();
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWOOPS, 0);
- }
- else if( strcmp(sfile->dir, "Scene/")==0 ) {
-
- for(a=0; a<sfile->totfile; a++) {
-
- sce= (Scene *)sfile->filelist[a].poin;
- if(sce) {
- if(sfile->filelist[a].flags & ACTIVE) sce->r.scemode |= R_BG_RENDER;
- else sce->r.scemode &= ~R_BG_RENDER;
- }
-
- }
- allqueue(REDRAWBUTSSCENE, 0);
- }
-}
-
-static void active_file_object(SpaceFile *sfile)
-{
- Object *ob;
-
- /* only when F4 DATABROWSE */
- if(filesel_has_func(sfile)) return;
-
- if( strcmp(sfile->dir, "Object/")==0 ) {
- if(sfile->act >= 0) {
-
- ob= (Object *)sfile->filelist[sfile->act].poin;
-
- if(ob && (ob->flag & OB_RESTRICT_VIEW)==0) {
- set_active_object(ob);
- if(BASACT && BASACT->object==ob) {
- BASACT->flag |= SELECT;
- sfile->filelist[sfile->act].flags |= ACTIVE;
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWOOPS, 0);
- scrarea_queue_winredraw(curarea);
- }
- }
- }
- }
-}
-
-
-void main_to_filelist(SpaceFile *sfile)
-{
- ID *id;
- struct direntry *files, *firstlib = NULL;
- ListBase *lb;
- int a, fake, idcode, len, ok, totlib, totbl;
- short hide = 0;
-
- if (sfile->flag & FILE_HIDE_DOT)
- hide = 1;
-
- if(sfile->dir[0]=='/') sfile->dir[0]= 0;
-
- if(sfile->dir[0]) {
- idcode= groupname_to_code(sfile->dir);
- if(idcode==0) sfile->dir[0]= 0;
- }
-
- if( sfile->dir[0]==0) {
-
- /* make directories */
- sfile->totfile= 24;
- sfile->filelist= (struct direntry *)malloc(sfile->totfile * sizeof(struct direntry));
-
- for(a=0; a<sfile->totfile; a++) {
- memset( &(sfile->filelist[a]), 0 , sizeof(struct direntry));
- sfile->filelist[a].type |= S_IFDIR;
- }
-
- sfile->filelist[0].relname= BLI_strdup("..");
- sfile->filelist[1].relname= BLI_strdup(".");
- sfile->filelist[2].relname= BLI_strdup("Scene");
- sfile->filelist[3].relname= BLI_strdup("Group");
- sfile->filelist[4].relname= BLI_strdup("Object");
- sfile->filelist[5].relname= BLI_strdup("Mesh");
- sfile->filelist[6].relname= BLI_strdup("Curve");
- sfile->filelist[7].relname= BLI_strdup("Metaball");
- sfile->filelist[8].relname= BLI_strdup("Material");
- sfile->filelist[9].relname= BLI_strdup("Texture");
- sfile->filelist[10].relname= BLI_strdup("Image");
- sfile->filelist[11].relname= BLI_strdup("Wave");
- sfile->filelist[12].relname= BLI_strdup("Lattice");
- sfile->filelist[13].relname= BLI_strdup("Lamp");
- sfile->filelist[14].relname= BLI_strdup("Camera");
- sfile->filelist[15].relname= BLI_strdup("Ipo");
- sfile->filelist[16].relname= BLI_strdup("World");
- sfile->filelist[17].relname= BLI_strdup("Screen");
- sfile->filelist[18].relname= BLI_strdup("VFont");
- sfile->filelist[19].relname= BLI_strdup("Text");
- sfile->filelist[20].relname= BLI_strdup("Armature");
- sfile->filelist[21].relname= BLI_strdup("Action");
- sfile->filelist[22].relname= BLI_strdup("NodeTree");
- sfile->filelist[23].relname= BLI_strdup("Brush");
-
- qsort(sfile->filelist, sfile->totfile, sizeof(struct direntry), compare_name);
- }
- else {
-
- /* make files */
- idcode= groupname_to_code(sfile->dir);
-
- lb= wich_libbase(G.main, idcode );
- if(lb==0) return;
-
- id= lb->first;
- sfile->totfile= 0;
- while(id) {
- if(filesel_has_func(sfile) && idcode==ID_IP) {
- if(sfile->ipotype== ((Ipo *)id)->blocktype) sfile->totfile++;
- }
- else if (hide==0 || id->name[2] != '.')
- sfile->totfile++;
-
- id= id->next;
- }
-
- if(!filesel_has_func(sfile)) sfile->totfile+= 2;
- sfile->filelist= (struct direntry *)malloc(sfile->totfile * sizeof(struct direntry));
-
- files= sfile->filelist;
-
- 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;
- memset( &(sfile->filelist[1]), 0 , sizeof(struct direntry));
- sfile->filelist[1].relname= BLI_strdup("..");
- sfile->filelist[1].type |= S_IFDIR;
-
- files+= 2;
- }
-
- id= lb->first;
- totlib= totbl= 0;
-
- while(id) {
-
- ok= 0;
- if(filesel_has_func(sfile) && idcode==ID_IP) {
- if(sfile->ipotype== ((Ipo *)id)->blocktype) ok= 1;
- }
- else ok= 1;
-
- if(ok) {
-
- if (hide==0 || id->name[2] != '.') {
- memset( files, 0 , sizeof(struct direntry));
- if(id->lib==NULL)
- files->relname= BLI_strdup(id->name+2);
- else {
- 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(!filesel_has_func(sfile)) { /* F4 DATA BROWSE */
- if(idcode==ID_OB) {
- if( ((Object *)id)->flag & SELECT) files->flags |= ACTIVE;
- }
- else if(idcode==ID_SCE) {
- if( ((Scene *)id)->r.scemode & R_BG_RENDER) files->flags |= ACTIVE;
- }
- }
- files->nr= totbl+1;
- files->poin= id;
- fake= id->flag & LIB_FAKEUSER;
-
- if(id->lib && fake) sprintf(files->extra, "LF %d", id->us);
- else if(id->lib) sprintf(files->extra, "L %d", id->us);
- else if(fake) sprintf(files->extra, "F %d", id->us);
- else sprintf(files->extra, " %d", id->us);
-
- if(id->lib) {
- if(totlib==0) firstlib= files;
- totlib++;
- }
-
- files++;
- }
- totbl++;
- }
-
- id= id->next;
- }
-
- /* only qsort of libraryblokken */
- if(totlib>1) {
- qsort(firstlib, totlib, sizeof(struct direntry), compare_name);
- }
- }
-
- sfile->maxnamelen= 0;
- for(a=0; a<sfile->totfile; a++) {
- len = BMF_GetStringWidth(G.font, sfile->filelist[a].relname);
- if (len > sfile->maxnamelen) sfile->maxnamelen = len;
-
- if(filetoname) {
- if( strcmp(sfile->file, sfile->filelist[a].relname)==0) {
- sfile->ofs= a-( sfile->collums*(curarea->winy-FILESELHEAD-10)/(2*FILESEL_DY));
- filetoname= 0;
- if(filesel_has_func(sfile)) sfile->filelist[a].flags |= ACTIVE;
- }
- }
- }
-}
-
-
-void clever_numbuts_filesel()
-{
- SpaceFile *sfile;
- char orgname[FILE_MAX+12];
- char filename[FILE_MAX+12];
- char newname[FILE_MAX+12];
- int test;
- int len;
-
- sfile= curarea->spacedata.first;
-
- if(sfile->type==FILE_MAIN) return;
-
- len = 110;
- test = get_hilited_entry(sfile);
-
- if (test != -1 && !(S_ISDIR(sfile->filelist[test].type))){
- BLI_make_file_string(G.sce, orgname, sfile->dir, sfile->filelist[test].relname);
- BLI_strncpy(filename, sfile->filelist[test].relname, sizeof(filename));
-
- add_numbut(0, TEX, "", 0, len, filename, "Rename File");
-
- if( do_clever_numbuts("Rename File", 1, REDRAW) ) {
- BLI_make_file_string(G.sce, newname, sfile->dir, filename);
-
- if( strcmp(orgname, newname) != 0 ) {
- BLI_rename(orgname, newname);
- freefilelist(sfile);
- }
- }
-
- scrarea_queue_winredraw(curarea);
- }
-}
-