== imagebrowser ==

* fix for do_versions, bump correction of old imasel to all files including version 2.44 
* refactoring of filtering code using indices instead of copying entries in filelist 
* memleak fix.
This commit is contained in:
Andrea Weikert
2007-09-14 18:21:23 +00:00
parent 1bde4e3274
commit ee6acc1061
3 changed files with 143 additions and 109 deletions

View File

@@ -6505,61 +6505,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
if (main->versionfile < 244) {
bScreen *sc;
Image* ima;
/* repair preview from 242 */
for(ima= main->image.first; ima; ima= ima->id.next) {
ima->preview = NULL;
}
/* repair imasel space - completely reworked */
for(sc= main->screen.first; sc; sc= sc->id.next) {
ScrArea *sa;
sa= sc->areabase.first;
while(sa) {
SpaceLink *sl;
for (sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= (SpaceImaSel*) sl;
simasel->blockscale= 0.7;
/* view 2D */
simasel->v2d.tot.xmin= -10.0;
simasel->v2d.tot.ymin= -10.0;
simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
simasel->v2d.cur.xmin= 0.0;
simasel->v2d.cur.ymin= 0.0;
simasel->v2d.cur.xmax= (float)sa->winx;
simasel->v2d.cur.ymax= (float)sa->winy;
simasel->v2d.min[0]= 1.0;
simasel->v2d.min[1]= 1.0;
simasel->v2d.max[0]= 32000.0f;
simasel->v2d.max[1]= 32000.0f;
simasel->v2d.minzoom= 0.5f;
simasel->v2d.maxzoom= 1.21f;
simasel->v2d.scroll= 0;
simasel->v2d.keepaspect= 1;
simasel->v2d.keepzoom= 1;
simasel->v2d.keeptot= 0;
simasel->prv_h = 96;
simasel->prv_w = 96;
simasel->flag = 7; /* ??? elubie */
strcpy (simasel->dir, U.textudir); /* TON */
strcpy (simasel->file, "");
simasel->returnfunc = 0;
simasel->title[0] = 0;
}
}
sa = sa->next;
}
}
}
if(main->versionfile <= 244) {
Scene *sce;
Material *ma;
@@ -6725,6 +6671,65 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
if (main->versionfile <= 245) {
bScreen *sc;
Image* ima;
/* fix all versions before 2.45 */
if (main->versionfile != 245) {
/* repair preview from 242 - 244*/
for(ima= main->image.first; ima; ima= ima->id.next) {
ima->preview = NULL;
}
/* repair imasel space - completely reworked */
for(sc= main->screen.first; sc; sc= sc->id.next) {
ScrArea *sa;
sa= sc->areabase.first;
while(sa) {
SpaceLink *sl;
for (sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= (SpaceImaSel*) sl;
simasel->blockscale= 0.7;
/* view 2D */
simasel->v2d.tot.xmin= -10.0;
simasel->v2d.tot.ymin= -10.0;
simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
simasel->v2d.cur.xmin= 0.0;
simasel->v2d.cur.ymin= 0.0;
simasel->v2d.cur.xmax= (float)sa->winx;
simasel->v2d.cur.ymax= (float)sa->winy;
simasel->v2d.min[0]= 1.0;
simasel->v2d.min[1]= 1.0;
simasel->v2d.max[0]= 32000.0f;
simasel->v2d.max[1]= 32000.0f;
simasel->v2d.minzoom= 0.5f;
simasel->v2d.maxzoom= 1.21f;
simasel->v2d.scroll= 0;
simasel->v2d.keepaspect= 1;
simasel->v2d.keepzoom= 1;
simasel->v2d.keeptot= 0;
simasel->prv_h = 96;
simasel->prv_w = 96;
simasel->flag = 7; /* ??? elubie */
strcpy (simasel->dir, U.textudir); /* TON */
strcpy (simasel->file, "");
simasel->returnfunc = 0;
simasel->title[0] = 0;
}
}
sa = sa->next;
}
}
}
}
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */

View File

@@ -589,10 +589,12 @@ static void do_imasel_buttons(short event, SpaceImaSel *simasel)
if (okee("Makedir")) {
BLI_recurdir_fileops(butname);
if (!BLI_exists(butname)) {
BIF_filelist_free(simasel->files);
BIF_filelist_parent(simasel->files);
BLI_strncpy(simasel->dir, BIF_filelist_dir(simasel->files), 80);
}
} else {
BIF_filelist_free(simasel->files);
BIF_filelist_parent(simasel->files);
BLI_strncpy(simasel->dir, BIF_filelist_dir(simasel->files), 80);
}

View File

@@ -91,10 +91,10 @@
typedef struct FileList
{
struct direntry *filelist;
struct direntry *unfiltered;
int *fidx;
int numfiles;
int numunfiltered;
int numfiltered;
char dir[FILE_MAXDIR];
short type;
short ipotype;
@@ -274,49 +274,44 @@ void BIF_filelist_filter(FileList* filelist)
return;
if (!filelist->filter) {
if (filelist->unfiltered) {
old_filelist = filelist->filelist;
filelist->filelist = filelist->unfiltered;
filelist->numfiles = filelist->numunfiltered;
filelist->unfiltered = 0;
filelist->numunfiltered = 0;
free (old_filelist);
if (filelist->fidx) {
MEM_freeN(filelist->fidx);
filelist->fidx = NULL;
}
filelist->fidx = (int *)MEM_callocN(filelist->numfiles*sizeof(int), "filteridx");
for (i = 0; i < filelist->numfiles; ++i) {
filelist->fidx[i] = i;
}
filelist->numfiltered = filelist->numfiles;
return;
}
if (!filelist->unfiltered) {
filelist->unfiltered = filelist->filelist;
filelist->numunfiltered = filelist->numfiles;
}
old_filelist = filelist->unfiltered;
num_files = filelist->numunfiltered;
filelist->filelist = 0;
// How many files are left after filter ?
for (i = 0; i < num_files; ++i) {
if (old_filelist[i].flags & filelist->filter) {
for (i = 0; i < filelist->numfiles; ++i) {
if (filelist->filelist[i].flags & filelist->filter) {
num_filtered++;
}
else if (old_filelist[i].type & S_IFDIR) {
else if (filelist->filelist[i].type & S_IFDIR) {
if (filelist->filter & FOLDERFILE) {
num_filtered++;
}
}
}
filelist->filelist = (struct direntry *)malloc(num_filtered * sizeof(struct direntry));
filelist->numfiles = num_filtered;
if (filelist->fidx) {
MEM_freeN(filelist->fidx);
filelist->fidx = NULL;
}
filelist->fidx = (int *)MEM_callocN(num_filtered*sizeof(int), "filteridx");
filelist->numfiltered = num_filtered;
for (i = 0, j=0; i < num_files; ++i) {
if (old_filelist[i].flags & filelist->filter) {
filelist->filelist[j++] = old_filelist[i];
for (i = 0, j=0; i < filelist->numfiles; ++i) {
if (filelist->filelist[i].flags & filelist->filter) {
filelist->fidx[j++] = i;
}
else if (old_filelist[i].type & S_IFDIR) {
else if (filelist->filelist[i].type & S_IFDIR) {
if (filelist->filter & FOLDERFILE) {
filelist->filelist[j++] = old_filelist[i];
filelist->fidx[j++] = i;
}
}
}
@@ -373,7 +368,7 @@ struct FileList* BIF_filelist_copy(struct FileList* filelist)
FileList* p = BIF_filelist_new();
BLI_strncpy(p->dir, filelist->dir, FILE_MAXDIR);
p->filelist = NULL;
p->unfiltered = NULL;
p->fidx = NULL;
p->type = filelist->type;
p->ipotype = filelist->ipotype;
p->has_func = filelist->has_func;
@@ -390,18 +385,15 @@ void BIF_filelist_free(struct FileList* filelist)
return;
}
if (filelist->unfiltered) {
struct direntry* filtered_files = filelist->filelist;
filelist->filelist = filelist->unfiltered;
filelist->numfiles = filelist->numunfiltered;
filelist->numunfiltered = 0;
free (filtered_files);
filelist->unfiltered = 0;
if (filelist->fidx) {
MEM_freeN(filelist->fidx);
filelist->fidx = NULL;
}
for (i = 0; i < filelist->numfiles; ++i) {
if (filelist->filelist[i].image)
if (filelist->filelist[i].image) {
IMB_freeImBuf(filelist->filelist[i].image);
}
filelist->filelist[i].image = 0;
if (filelist->filelist[i].relname)
MEM_freeN(filelist->filelist[i].relname);
@@ -414,6 +406,8 @@ void BIF_filelist_free(struct FileList* filelist)
filelist->numfiles = 0;
free(filelist->filelist);
filelist->filelist = 0;
filelist->filter = 0;
filelist->numfiltered =0;
}
void BIF_filelist_freelib(struct FileList* filelist)
@@ -430,7 +424,7 @@ struct BlendHandle *BIF_filelist_lib(struct FileList* filelist)
int BIF_filelist_numfiles(struct FileList* filelist)
{
return filelist->numfiles;
return filelist->numfiltered;
}
const char * BIF_filelist_dir(struct FileList* filelist)
@@ -462,19 +456,25 @@ void BIF_filelist_loadimage(struct FileList* filelist, int index)
int imgheight = filelist->prv_h;
short ex, ey, dx, dy;
float scaledx, scaledy;
int fidx = 0;
if ( (index < 0) || (index >= filelist->numfiltered) ) {
return;
}
fidx = filelist->fidx[index];
if (!filelist->filelist[index].image)
if (!filelist->filelist[fidx].image)
{
if (filelist->type != FILE_MAIN)
{
if ( filelist->filelist[index].flags & IMAGEFILE ) {
imb = IMB_thumb_manage(filelist->dir, filelist->filelist[index].relname, THB_NORMAL, THB_SOURCE_IMAGE);
} else if ( filelist->filelist[index].flags & MOVIEFILE ) {
imb = IMB_thumb_manage(filelist->dir, filelist->filelist[index].relname, THB_NORMAL, THB_SOURCE_MOVIE);
if ( filelist->filelist[fidx].flags & IMAGEFILE ) {
imb = IMB_thumb_manage(filelist->dir, filelist->filelist[fidx].relname, THB_NORMAL, THB_SOURCE_IMAGE);
} else if ( filelist->filelist[fidx].flags & MOVIEFILE ) {
imb = IMB_thumb_manage(filelist->dir, filelist->filelist[fidx].relname, THB_NORMAL, THB_SOURCE_MOVIE);
if (!imb) {
/* remember that file can't be loaded via IMB_open_anim */
filelist->filelist[index].flags &= ~MOVIEFILE;
filelist->filelist[index].flags |= MOVIEFILE_ICON;
filelist->filelist[fidx].flags &= ~MOVIEFILE;
filelist->filelist[fidx].flags |= MOVIEFILE_ICON;
}
}
if (imb) {
@@ -495,7 +495,7 @@ void BIF_filelist_loadimage(struct FileList* filelist, int index)
IMB_scaleImBuf(imb, ex, ey);
}
filelist->filelist[index].image = imb;
filelist->filelist[fidx].image = imb;
}
}
@@ -503,13 +503,20 @@ void BIF_filelist_loadimage(struct FileList* filelist, int index)
struct ImBuf * BIF_filelist_getimage(struct FileList* filelist, int index)
{
ImBuf* ibuf = filelist->filelist[index].image;
ImBuf* ibuf = NULL;
int fidx = 0;
if ( (index < 0) || (index >= filelist->numfiltered) ) {
return NULL;
}
fidx = filelist->fidx[index];
ibuf = filelist->filelist[fidx].image;
if (ibuf == NULL) {
struct direntry *file = &filelist->filelist[index];
struct direntry *file = &filelist->filelist[fidx];
if (file->type & S_IFDIR) {
if ( strcmp(filelist->filelist[index].relname, "..") == 0) {
if ( strcmp(filelist->filelist[fidx].relname, "..") == 0) {
ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT];
} else if ( strcmp(filelist->filelist[index].relname, ".") == 0) {
} else if ( strcmp(filelist->filelist[fidx].relname, ".") == 0) {
ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH];
} else {
ibuf = gSpecialFileImages[SPECIAL_IMG_FOLDER];
@@ -537,21 +544,40 @@ struct ImBuf * BIF_filelist_getimage(struct FileList* filelist, int index)
struct direntry * BIF_filelist_file(struct FileList* filelist, int index)
{
return &filelist->filelist[index];
int fidx = 0;
if ( (index < 0) || (index >= filelist->numfiltered) ) {
return NULL;
}
fidx = filelist->fidx[index];
return &filelist->filelist[fidx];
}
int BIF_filelist_find(struct FileList* filelist, char *file)
{
int index = -1;
int i;
int fidx = -1;
if (!filelist->fidx)
return;
for (i = 0; i < filelist->numfiles; ++i) {
if ( strcmp(filelist->filelist[i].relname, file) == 0) {
index = i;
break;
}
}
return index;
for (i = 0; i < filelist->numfiltered; ++i) {
if (filelist->fidx[i] == index) {
fidx = i;
break;
}
}
return fidx;
}
void BIF_filelist_hidedot(struct FileList* filelist, short hide)
@@ -570,7 +596,7 @@ void BIF_filelist_readdir(struct FileList* filelist)
int finished = 0;
if (!filelist) return;
filelist->unfiltered = 0;
filelist->fidx = 0;
filelist->filelist = 0;
if(filelist->type==FILE_MAIN) {
@@ -1078,6 +1104,7 @@ void BIF_filelist_sort(struct FileList* filelist, short sort)
for(num=0; num<filelist->numfiles; num++, file++) {
file->flags &= ~HILITE;
}
BIF_filelist_filter(filelist);
}