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/drawimasel.c')
-rw-r--r--source/blender/src/drawimasel.c1338
1 files changed, 573 insertions, 765 deletions
diff --git a/source/blender/src/drawimasel.c b/source/blender/src/drawimasel.c
index 45757170f78..00917233109 100644
--- a/source/blender/src/drawimasel.c
+++ b/source/blender/src/drawimasel.c
@@ -47,811 +47,613 @@
#endif
#include "MEM_guardedalloc.h"
-#include "BMF_Api.h"
-#include "BLI_blenlib.h"
-#include "IMB_imbuf_types.h"
+
+#include "DNA_ID.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_object_types.h"
+#include "DNA_material_types.h"
+
+#include "BLI_blenlib.h"
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
+#include "BLI_storage_types.h"
+
#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_icons.h"
+#include "BKE_utildefines.h"
+#include "BIF_filelist.h"
-#include "BIF_fsmenu.h"
#include "BIF_gl.h"
-#include "BIF_resources.h"
+#include "BIF_glutil.h"
+#include "BIF_mywindow.h"
#include "BIF_screen.h"
+#include "BIF_resources.h"
+#include "BIF_language.h"
+
#include "BIF_interface.h"
#include "BIF_interface_icons.h"
-#include "BIF_imasel.h"
-#include "BIF_mywindow.h"
+#include "BIF_previewrender.h"
+#include "BIF_fsmenu.h"
#include "BIF_space.h"
-#include "BIF_resources.h"
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "BSE_drawimasel.h"
-#include "BSE_filesel.h"
+#include "BSE_drawipo.h" /* for v2d functions */
+#include "BSE_view.h"
-#include "blendef.h"
-#include "mydevice.h"
+#include "BLO_readfile.h"
-#define IMALINESIZE 16
-/* well, who would have thought ... */
-#define lrectwrite(a, b, c, d, rect) {glRasterPos2i(a, b);glDrawPixels((c)-(a)+1, (d)-(b)+1, GL_RGBA, GL_UNSIGNED_BYTE, rect);}
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
-/* GLOBALS */
-extern char *fsmenu;
+#include "PIL_time.h"
-void rectwrite_imasel(int , int , int , int , int , int , int , int , float , float , unsigned int *);
+#include "blendef.h"
+#include "mydevice.h"
-void rectwrite_imasel(int winxmin, int winymin, int winxmax, int winymax, int x1, int y1, int xim, int yim, float zoomx, float zoomy, unsigned int *rect)
-{
- int cx, cy, oldxim, x2, y2;
-
- oldxim= xim;
-
- /* coordinates how it will be put at screen */
- x2= x1+ zoomx*xim;
- y2= y1+ zoomy*yim;
-
- /* partial clip */
- if(x1<=winxmin) {
- /* with OpenGL, rects are not allowed to start outside of the left/bottom window edge */
- cx= winxmin-x1+(int)zoomx;
- /* make sure the rect will be drawn pixel-exact */
- cx/= zoomx;
- cx++;
- x1+= zoomx*cx;
- xim-= cx;
- rect+= cx;
- }
- if(y1<=winymin) {
- cy= winymin-y1+(int)zoomy;
- cy/= zoomy;
- cy++;
- y1+= zoomy*cy;
- rect+= cy*oldxim;
- yim-= cy;
+#include "interface.h" /* urm... for rasterpos_safe, roundbox */
+
+#define BUTTONWIDTH 20
+#define BOOKMARKWIDTH_MAX 240
+
+void calc_imasel_rcts(SpaceImaSel *simasel, int winx, int winy)
+{
+ int width = (int)16.0f*simasel->aspect;
+ int numtiles;
+ int numfiles = 0;
+ int tilewidth = simasel->prv_w + TILE_BORDER_X*4;
+ int tileheight = simasel->prv_h + TILE_BORDER_Y*4 + U.fontsize;
+
+ // complete area of the space
+ simasel->v2d.mask.xmin= simasel->v2d.mask.ymin = 0;
+ simasel->v2d.mask.xmax= winx;
+ simasel->v2d.mask.ymax= winy;
+
+ // vertical scroll bar
+ simasel->v2d.vert= simasel->v2d.mask;
+ simasel->v2d.vert.xmax -= TILE_BORDER_X + 2;
+ simasel->v2d.vert.xmin= simasel->v2d.vert.xmax- width - TILE_BORDER_X - 2;
+ simasel->v2d.vert.ymax -= IMASEL_BUTTONS_HEIGHT + TILE_BORDER_Y + 2;
+ simasel->v2d.vert.ymin += TILE_BORDER_Y + 2;
+ // simasel->v2d.mask.xmax= simasel->v2d.vert.xmin;
+
+ if (simasel->flag & FILE_BOOKMARKS) {
+ int bmwidth = (simasel->v2d.vert.xmin - simasel->v2d.mask.xmin)/4.0f;
+ if (bmwidth > BOOKMARKWIDTH_MAX) bmwidth = BOOKMARKWIDTH_MAX;
+
+ simasel->bookmarkrect.xmin = simasel->v2d.mask.xmin + TILE_BORDER_X;
+ simasel->bookmarkrect.xmax = simasel->v2d.mask.xmin + bmwidth - TILE_BORDER_X;
+ simasel->bookmarkrect.ymax = simasel->v2d.mask.ymax - IMASEL_BUTTONS_HEIGHT - TILE_BORDER_Y;
+ simasel->bookmarkrect.ymin = simasel->v2d.mask.ymin + TILE_BORDER_Y;
+
+ simasel->viewrect.xmin = simasel->bookmarkrect.xmax + TILE_BORDER_X;
+ simasel->viewrect.xmax = simasel->v2d.vert.xmin - TILE_BORDER_X;
+ simasel->viewrect.ymax = simasel->v2d.mask.ymax - IMASEL_BUTTONS_HEIGHT - TILE_BORDER_Y;
+ simasel->viewrect.ymin = simasel->v2d.mask.ymin + TILE_BORDER_Y;
+ } else {
+ simasel->viewrect.xmin = simasel->v2d.mask.xmin + TILE_BORDER_X;
+ simasel->viewrect.xmax = simasel->v2d.vert.xmin - TILE_BORDER_X;
+ simasel->viewrect.ymax = simasel->v2d.mask.ymax - IMASEL_BUTTONS_HEIGHT - TILE_BORDER_Y;
+ simasel->viewrect.ymin = simasel->v2d.mask.ymin + TILE_BORDER_Y;
}
- if(x2>=winxmax) {
- cx= x2-winxmax;
- cx/= zoomx;
- xim-= cx+3;
+
+ simasel->numtilesx = (simasel->viewrect.xmax - simasel->viewrect.xmin) / tilewidth;
+ simasel->numtilesy = (simasel->viewrect.ymax - simasel->viewrect.ymin) / tileheight;
+ numtiles = simasel->numtilesx*simasel->numtilesy;
+
+ if (simasel->files) {
+ numfiles = BIF_filelist_numfiles(simasel->files);
}
- if(y2>=winymax) {
- cy= y2-winymax;
- cy/= zoomy;
- yim-= cy+3;
+ if (numtiles > numfiles) numtiles = numfiles;
+
+ simasel->scrollarea = ((float)simasel->v2d.vert.ymax - (float)simasel->v2d.vert.ymin);
+ if (numtiles < numfiles) {
+ simasel->scrollheight = ((float)numtiles / (float)numfiles)*simasel->scrollarea;
+ simasel->scrollarea -= simasel->scrollheight;
+ } else {
+ simasel->scrollheight = simasel->scrollarea;
}
-
- if(xim<=0) return;
- if(yim<=0) return;
+ if (simasel->scrollarea < 0) simasel->scrollarea = 0;
+}
-// mywinset(curarea->win);
- glScissor(winxmin, winymin, winxmax-winxmin+1, winymax-winymin+1);
-
- glPixelStorei(GL_UNPACK_ROW_LENGTH, oldxim);
-
- glPixelZoom(zoomx, zoomy);
+void draw_imasel_scroll(SpaceImaSel *simasel)
+{
+ rcti scrollbar;
+ rcti scrollhandle;
- glRasterPos2i(x1, y1);
- glDrawPixels(xim, yim, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+ scrollbar.xmin= simasel->v2d.cur.xmin + simasel->v2d.vert.xmin;
+ scrollbar.ymin = simasel->v2d.cur.ymin + simasel->v2d.vert.ymin;
+ scrollbar.xmax= simasel->v2d.cur.xmin + simasel->v2d.vert.xmax;
+ scrollbar.ymax = simasel->v2d.cur.ymin + simasel->v2d.vert.ymax;
- glPixelZoom(1.0, 1.0);
+ scrollhandle.xmin= scrollbar.xmin;
+ scrollhandle.ymin = scrollbar.ymax - simasel->scrollpos -1;
+ scrollhandle.xmax= scrollbar.xmax-1;
+ scrollhandle.ymax = scrollbar.ymax - simasel->scrollpos - simasel->scrollheight;
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-}
+ BIF_ThemeColor(TH_SHADE1);
+ glRecti(scrollbar.xmin, scrollbar.ymin, scrollbar.xmax, scrollbar.ymax);
+ uiEmboss(scrollbar.xmin-2, scrollbar.ymin-2, scrollbar.xmax+2, scrollbar.ymax+2, 1);
-void viewgate(short sx, short sy, short ex, short ey)
-{
- short wx, wy;
- wx = curarea->winrct.xmin; wy = curarea->winrct.ymin;
- glViewport(wx+sx, wy+sy, (wx+ex )-(wx+sx)+1, (wy+ey )-(wy+sy)+1);
- glScissor(wx+sx, wy+sy, (wx+ex )-(wx+sx)+1, (wy+ey )-(wy+sy)+1);
- myortho2((float)sx-0.375 , (float)ex-0.375, (float)sy-0.375, (float)ey-0.375);
-}
+ BIF_ThemeColor(TH_SHADE2);
+ glRecti(scrollhandle.xmin, scrollhandle.ymin, scrollhandle.xmax, scrollhandle.ymax);
-void areaview (void)
-{
- short wx, wy;
- wx = curarea->winrct.xmin; wy = curarea->winrct.ymin;
- glViewport(wx, wy, curarea->winx, curarea->winy);
- glScissor(wx, wy, curarea->winx, curarea->winy);
- myortho2(-0.375, (float)(curarea->winx)-0.375, -0.375, (float)(curarea->winy)-0.375);
-
+ uiEmboss(scrollhandle.xmin, scrollhandle.ymin, scrollhandle.xmax, scrollhandle.ymax, 1);
}
-
-void calc_hilite(SpaceImaSel *simasel)
+
+static void draw_tile(SpaceImaSel *simasel, short sx, short sy, int colorid)
{
- OneSelectableIma *ima;
- ImaDir *direntry;
- short mx, my;
- int i, area_event;
-
- if (simasel->hilite > -1) {
- direntry = simasel->firstdir;
- while(direntry){
- direntry->hilite = 0;
- direntry = direntry->next;
- }
- simasel->hilite = -1;
- }
-
- if (simasel->totalima){
- simasel->hilite_ima = 0;
- ima = simasel->first_sel_ima;
- while (ima){
- ima->selectable = 0;
- ima = ima->next;
- }
- }
-
- area_event = 0;
- mx = simasel->mx;
- my = simasel->my;
-
- if (simasel->desx > 0){
- if ( (mx > simasel->desx) && (mx < simasel->deex) && (my > simasel->desy) && (my < simasel->deey) ) area_event = IMS_INDIR;
- }
- if (simasel->fesx > 0){
- if ( (mx > simasel->fesx) && (mx < simasel->feex) && (my > simasel->fesy) && (my < simasel->feey) ) area_event = IMS_INFILE;
- }
-
- switch(area_event){
- case IMS_INDIR:
- simasel->hilite = simasel->topdir + ((simasel->deey - my - 4) / IMALINESIZE);
-
- if (my >= simasel->deey) simasel->hilite = -1;
- if (simasel->hilite >= simasel->totaldirs) simasel->hilite = -1;
-
- if (simasel->hilite > -1){
- direntry = simasel->firstdir;
- for (i = simasel->hilite; i>0; i--){
- direntry = direntry->next;
- }
- direntry->hilite = 1;
-
- }
- simasel->mouse_move_redraw = 1;
- break;
-
- case IMS_INFILE:
- if (simasel->totalima){
- ima = simasel->first_sel_ima;
- while (ima){
- ima->selectable = 0;
-
- if (ima->draw_me) {
- if ((mx > ima->sx) && (mx < ima->sx+76) && (my > ima->sy-16) && (my < ima->sy+76)) {
- ima->selectable = 1;
- simasel->hilite_ima = ima;
- simasel->mouse_move_redraw = 1;
- }
- }
-
- ima = ima->next;
- }
- }
- break;
- }
+ /* TODO: BIF_ThemeColor seems to need this to show the color, not sure why? - elubie */
+ glEnable(GL_BLEND);
+ glColor4ub(0, 0, 0, 100);
+ glDisable(GL_BLEND);
+
+ BIF_ThemeColor4(colorid);
+ uiSetRoundBox(15);
+ uiRoundBox(sx+TILE_BORDER_X, sy - simasel->prv_h - TILE_BORDER_Y*3 - U.fontsize, sx + simasel->prv_w + TILE_BORDER_X*3, sy, 6);
}
-
-void make_sima_area(SpaceImaSel *simasel)
-{
- OneSelectableIma *ima;
- short rh, dm, sc;
- short boxperline, boxlines, boxlinesinview, boxlinesleft;
-
-/* ima slider box */
- simasel->fssx = 8;
- simasel->fssy = 8;
- simasel->fsex = 30;
- simasel->fsey = curarea->winy-64;
-/* ima entry's box */
- simasel->fesx = simasel->fsex + 8;
- simasel->fesy = simasel->fssy;
- simasel->feex = curarea->winx- 8;
- simasel->feey = curarea->winy-64;
-/* ima names */
- simasel->dnsx = 38;
- simasel->dnsy = curarea->winy - 29;
- simasel->dnw = curarea->winx - 8 - 38;
- simasel->dnh = 21;
- simasel->fnsx = simasel->fesx;
- simasel->fnsy = curarea->winy - 29 - 29;
- simasel->fnw = curarea->winx - 8 - simasel->fnsx;
- simasel->fnh = 21;
-
- if ((simasel->mode & 1)==1){
- /* dir slider box */
- simasel->dssx = 8;
-
- simasel->dsex = 30;
- simasel->dsey = curarea->winy-64;
- /* dir entry's box */
- simasel->desx = 38;
- simasel->desy = 8;
-
- simasel->deex = 208;
- simasel->deey = curarea->winy-64;
- simasel->dssy = simasel->desy;
- if (simasel->deex > (curarea->winx -8) ) simasel->deex = curarea->winx - 8;
- if (simasel->deex <= simasel->desx ) simasel->dssx = 0;
- /* file slider & entry & name box ++ */
- simasel->fssx += 216;
- simasel->fsex += 216;
- simasel->fesx += 216;
- simasel->fnsx += 216;
- simasel->fnw -= 216;
- }else{
- simasel->desx = 0;
- }
-
- if ((simasel->mode & 2) == 2){
- simasel->fesy += 32;
- simasel->infsx = simasel->fesx; simasel->infsy = 8;
- simasel->infex = simasel->feex; simasel->infey = 28;
- }else{
- simasel->infsx = 0;
+static float shorten_string(SpaceImaSel *simasel, char* string, float w)
+{
+ short shortened = 0;
+ float sw = 0;
+
+ sw = BIF_GetStringWidth(simasel->curfont, string, 0);
+ while (sw>w) {
+ int slen = strlen(string);
+ string[slen-1] = '\0';
+ sw = BIF_GetStringWidth(simasel->curfont, string, 0);
+ shortened = 1;
}
-
- simasel->dsdh = simasel->deey - simasel->desy - 4;
-
- if (simasel->dsdh <= 16) { simasel->desx = 0; }
- if ((simasel->feex-16) <= simasel->fesx) { simasel->fesx = 0; }
- if ((simasel->infex-16) <= simasel->infsx) { simasel->infsx = 0; }
-
- if ((simasel->deey ) <= simasel->desy) { simasel->desx = 0; }
- if ((simasel->feey ) <= simasel->fesy) { simasel->fesx = 0; }
- if ((simasel->infey ) > simasel->feey) { simasel->infsx = 0;}
-
- /* Dir Slider */
- if (simasel->desx != 0){
- simasel->dirsli = 0;
-
- simasel->dirsli_lines = (simasel->dsdh / IMALINESIZE);
- simasel->dirsli_h = 0;
-
- if (simasel->topdir < 0) simasel->topdir = 0;
- if (simasel->topdir > (simasel->totaldirs - simasel->dirsli_lines) ) simasel->topdir = (simasel->totaldirs - simasel->dirsli_lines);
-
- if ( (simasel->totaldirs * IMALINESIZE) >= simasel->dsdh ){
- simasel->dirsli = 1;
- simasel->dirsli_sx = simasel->dssx+2;
- simasel->dirsli_ex = simasel->dsex-2;
-
- simasel->dirsli_h = (simasel->dsdh) * (float)simasel->dirsli_lines / (float)simasel->totaldirs;
- simasel->dirsli_ey = simasel->dsey - 2;
- if (simasel->topdir) {
- rh = (simasel->dsdh - simasel->dirsli_h);
- simasel->dirsli_ey -= rh * (float)((float)simasel->topdir / (float)(simasel->totaldirs - simasel->dirsli_lines ));
- }
-
- if (simasel->dirsli_h < 4) simasel->dirsli_h = 4;
-
- }else{
- simasel->topdir = 0;
- }
- }
-
- if (simasel->totalima){
- /* there are images */
-
- ima = simasel->first_sel_ima;
-
-
- boxperline = (simasel->feex - simasel->fesx) / 80;
- if (boxperline) boxlines = 1 + (simasel->totalima / boxperline); else boxlines = 1;
- boxlinesinview = (simasel->feey - simasel->fesy) / 100;
- boxlinesleft = boxlines - boxlinesinview;
-
- if (boxlinesleft > 0){
- /* slider needed */
-
- simasel->slider_height = boxlinesinview / (float)(boxlines+1);
- simasel->slider_space = 1.0 - simasel->slider_height;
-
- simasel->imasli_sx = simasel->fssx+1;
- simasel->imasli_ex = simasel->fsex-1;
- simasel->fsdh = simasel->fsey - simasel->fssy - 4;
-
- simasel->imasli_h = simasel->fsdh * simasel->slider_height;
- if (simasel->imasli_h < 6) simasel->imasli_h = 6;
- simasel->imasli_ey = simasel->fsey - 2 - (simasel->fsdh * simasel->slider_space * simasel->image_slider);
-
- simasel->imasli = 1;
-
- }else{
- simasel->image_slider = 0;
- simasel->imasli = 0;
- }
-
- sc = simasel->image_slider * (boxlinesleft * 100);
-
- simasel->curimax = simasel->fesx + 8;
- simasel->curimay = simasel->feey - 90 + sc;
-
- dm = 1;
- if (simasel->curimay-2 < simasel->fesy) dm = 0;
- // let first row of icons remain selectable
- if(OLD_IMASEL) if (simasel->curimay+80 > simasel->feey) dm = 0;
- if (simasel->curimax+72 > simasel->feex) dm = 0;
-
- simasel->total_selected = 0;
- while (ima){
- ima->draw_me = dm;
-
- if (ima->selected) simasel->total_selected++;
-
- ima->sx = simasel->curimax;
- ima->sy = simasel->curimay+16;
-
- ima->ex = ima->sx + ima->dw;
- ima->ey = ima->sy + ima->dh;
-
- simasel->curimax += 80;
- if (simasel->curimax + 72 > simasel->feex){
-
- simasel->curimax = simasel->fesx + 8;
- simasel->curimay -= 100;
-
- dm = 1;
- // let icons that fall off (top/bottom) be selectable
- if(OLD_IMASEL) {
- if (simasel->curimay+80 > simasel->feey) dm = 0;
- if (simasel->curimay-8 < simasel->fesy) dm = 0;
- }
-
- }
- ima = ima->next;
+ if (shortened) {
+ int slen = strlen(string);
+ if (slen > 3) {
+ BLI_strncpy(string+slen-3, "...", 4);
}
}
+ return sw;
}
-static void str_image_type(int ftype, char *name)
+static void draw_file(SpaceImaSel *simasel, short sx, short sy, struct direntry *file)
{
- strcpy(name, "");
-
- if((ftype & JPG_MSK) == JPG_STD) strcat(name, "std ");
- if((ftype & JPG_MSK) == JPG_VID) strcat(name, "video ");
- if((ftype & JPG_MSK) == JPG_JST) strcat(name, "amiga ");
- if((ftype & JPG_MSK) == JPG_MAX) strcat(name, "max ");
-
- if( ftype == AN_hamx) { strcat(name, "hamx "); return; }
+ short soffs;
+ char fname[FILE_MAXFILE];
+ float sw;
+
+ BLI_strncpy(fname,file->relname, FILE_MAXFILE);
+ sw = shorten_string(simasel, fname, simasel->prv_w );
+ soffs = (simasel->prv_w + TILE_BORDER_X*4 - sw) / 2;
- if( ftype == IMAGIC ) { strcat(name, "sgi "); return; }
- if( ftype & JPG ) { strcat(name, "jpeg "); }
- if( ftype & TGA ) { strcat(name, "targa "); }
- if( ftype & PNG ) { strcat(name, "png "); }
- if( ftype & BMP ) { strcat(name, "bmp "); }
- if( ftype & AMI ) { strcat(name, "iff "); }
-#ifdef WITH_QUICKTIME
- if( ftype & QUICKTIME ) { strcat(name, "quicktime "); }
+ ui_rasterpos_safe(sx+soffs, sy - simasel->prv_h - TILE_BORDER_Y*2 - U.fontsize, simasel->aspect);
+#ifdef WIN32
+ BIF_DrawString(simasel->curfont, fname, ((U.transopts & USER_TR_MENUS) | CONVERT_TO_UTF8));
+#else
+ BIF_DrawString(simasel->curfont, fname, (U.transopts & USER_TR_MENUS));
#endif
}
-void draw_sima_area(SpaceImaSel *simasel)
-{
- uiBlock *block;
- OneSelectableIma *ima;
- ImaDir *direntry;
- float col[3];
- int i, info;
- short sx, sy, ex, ey, sc;
- char naam[256], infostr[256];
-
- BIF_GetThemeColor3fv(TH_BACK, col);
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- sprintf(naam, "win %d", curarea->win);
- block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->win);
- uiBlockSetCol(block, TH_BUT_SETTING1);
-
- if (simasel->desx > 0){
- /* DIR ENTRYS */
- BIF_ThemeColorShade(TH_SHADE1, -70);
- glRecti(simasel->dssx, simasel->dssy, simasel->dsex, simasel->dsey);
- glRecti(simasel->desx, simasel->desy, simasel->deex, simasel->deey);
-
- uiEmboss(simasel->dssx, simasel->dssy, simasel->dsex, simasel->dsey,1);
- uiEmboss(simasel->desx, simasel->desy, simasel->deex, simasel->deey,1);
+static void draw_imasel_bookmarks(ScrArea *sa, SpaceImaSel *simasel)
+{
+ char bookmark[FILE_MAX];
+ float sw;
+
+ if (simasel->flag & FILE_BOOKMARKS) {
+ int nentries = fsmenu_get_nentries();
+ int i;
+ short sx, sy;
+ int bmwidth;
+ int linestep = U.fontsize*3/2;
- if (simasel->dirsli == 1) {
- sx = simasel->dirsli_sx+2;
- sy = simasel->dirsli_ey - simasel->dirsli_h+2;
- ex = simasel->dirsli_ex-2;
- ey = simasel->dirsli_ey-2;
+ sx = simasel->bookmarkrect.xmin + TILE_BORDER_X;
+ sy = simasel->bookmarkrect.ymax - TILE_BORDER_Y - linestep;
+ bmwidth = simasel->bookmarkrect.xmax - simasel->bookmarkrect.xmin - 2*TILE_BORDER_X;
+
+ if (bmwidth < 0) return;
+
+ for (i=0; i< nentries && sy > linestep ;++i) {
+ char *fname = fsmenu_get_entry(i);
+ char *sname = NULL;
- BIF_ThemeColor(TH_SHADE1);
+ if (fname) {
+ int sl;
+ BLI_strncpy(bookmark, fname, FILE_MAX);
- glRecti(sx, sy, ex, ey);
- uiEmboss(sx, sy, ex,ey,0);
- }
- if (simasel->totaldirs) {
- sx = simasel->desx+8;
- sy = simasel->deey-IMALINESIZE;
-
- direntry = simasel->firstdir;
- if (simasel->topdir){
- for(i = simasel->topdir; i>0; i--){
- direntry = direntry->next;
+ sl = strlen(bookmark)-1;
+ if (bookmark[sl] == '\\' || bookmark[sl] == '/') {
+ bookmark[sl] = '\0';
+ sl--;
}
- }
- viewgate(simasel->desx, simasel->desy, simasel->deex-4, simasel->deey);
-
- i = simasel->dirsli_lines;
- if (i > simasel->totaldirs) i = simasel->totaldirs;
- for(;i > 0; i--){
- strcpy(naam, direntry->name);
-
- cpack(0xFFFFFF);
- if (direntry->selected == 1){
- cpack(0x7777CC);
- glRecti(simasel->desx+2, sy-4, simasel->deex-4, sy+IMALINESIZE-4);
- cpack(0xFFFFFF);
+ while (sl) {
+ if (bookmark[sl] == '\\' || bookmark[sl] == '/'){
+ sl++;
+ break;
+ };
+ sl--;
}
- if (direntry->hilite == 1){
- cpack(0x999999);
- glRecti(simasel->desx+2, sy-4, simasel->deex-4, sy+IMALINESIZE-4);
- cpack(0xFFFFFF);
+ sname = &bookmark[sl];
+ sw = shorten_string(simasel, sname, bmwidth);
+ if (simasel->active_bookmark == i ) {
+ BIF_ThemeColor(TH_TEXT_HI);
+ } else {
+ BIF_ThemeColor(TH_TEXT);
}
-
- glRasterPos2i(sx, sy);
- BMF_DrawString(G.font, naam);
-
- direntry = direntry->next;
- sy-=IMALINESIZE;
+ ui_rasterpos_safe(sx, sy, simasel->aspect);
+#ifdef WIN32
+ BIF_DrawString(simasel->curfont, sname, ((U.transopts & USER_TR_MENUS) | CONVERT_TO_UTF8));
+#else
+ BIF_DrawString(simasel->curfont, sname, (U.transopts & USER_TR_MENUS));
+#endif
+ sy -= linestep;
+ } else {
+ cpack(0xB0B0B0);
+ sdrawline(sx, sy + U.fontsize/2 , sx + bmwidth, sy + U.fontsize/2);
+ cpack(0x303030);
+ sdrawline(sx, sy + 1 + U.fontsize/2 , sx + bmwidth, sy + 1 + U.fontsize/2);
+ sy -= linestep;
}
- areaview();
-
- }
-
- /* status icons */
-
- sx = simasel->desx;
- sy = simasel->deey+6;
-
- if (bitset(simasel->fase, IMS_FOUND_BIP)) {
- BIF_icon_draw(sx+16*0, sy, ICON_BPIBFOLDER_HLT);
- } else if (bitset(simasel->fase, IMS_WRITE_NO_BIP)) {
- BIF_icon_draw(sx+16*0, sy, ICON_BPIBFOLDER_DEHLT);
- } else {
- BIF_icon_draw(sx+16*0, sy, ICON_BPIBFOLDER_DEHLT);
}
- if (bitset(simasel->fase, IMS_KNOW_INF)) {
- BIF_icon_draw(sx+16*1, sy, ICON_FOLDER_HLT);
+ uiEmboss(simasel->bookmarkrect.xmin, simasel->bookmarkrect.ymin, simasel->bookmarkrect.xmax-1, simasel->bookmarkrect.ymax-1, 1);
+ }
+}
+
+static void draw_imasel_previews(ScrArea *sa, SpaceImaSel *simasel)
+{
+ static double lasttime= 0;
+ struct FileList* files = simasel->files;
+ int numfiles;
+ struct direntry *file;
+ int numtiles;
+
+ int tilewidth = simasel->prv_w + TILE_BORDER_X*4;
+ int tileheight = simasel->prv_h + TILE_BORDER_Y*4 + U.fontsize;
+ short sx, sy;
+ int do_load = 1;
+
+ ImBuf* imb=0;
+ int i,j;
+ short type;
+ int colorid = 0;
+ int todo;
+ int fileoffset, rowoffset, columnoffset;
+ float scrollofs;
+
+
+ rcti viewrect = simasel->viewrect;
+
+ if (!files) return;
+ /* Reload directory */
+ BLI_strncpy(simasel->dir, BIF_filelist_dir(files), FILE_MAXDIR);
+
+ type = BIF_filelist_gettype(simasel->files);
+
+ if (BIF_filelist_empty(files))
+ {
+ unsigned int filter = 0;
+ BIF_filelist_hidedot(simasel->files, simasel->flag & FILE_HIDE_DOT);
+ if (simasel->flag & FILE_FILTER) {
+ filter = simasel->filter ;
} else {
- BIF_icon_draw(sx+16*1, sy, ICON_FOLDER_DEHLT);
+ filter = 0;
}
+
+ BIF_filelist_setfilter(simasel->files, filter);
+ BIF_filelist_readdir(files);
- if (bitset(simasel->fase, IMS_KNOW_IMA)) {
- BIF_icon_draw(sx+16*2, sy, ICON_BLUEIMAGE_HLT);
- } else {
- BIF_icon_draw(sx+16*2, sy, ICON_BLUEIMAGE_DEHLT);
- }
+ if(simasel->sort!=FILE_SORTALPHA) BIF_filelist_sort(simasel->files, simasel->sort);
}
-
- if (simasel->fesx > 0) {
- int extrabutsize;
-
- BIF_ThemeColorShade(TH_SHADE1, -80);
- glRecti(simasel->fssx, simasel->fssy, simasel->fsex, simasel->fsey);
+ BIF_filelist_imgsize(simasel->files,simasel->prv_w,simasel->prv_h);
- glRecti(simasel->fesx, simasel->fesy, simasel->feex, simasel->feey);
+ numfiles = BIF_filelist_numfiles(files);
+ numtiles = simasel->numtilesx*simasel->numtilesy;
- uiEmboss(simasel->fssx-1, simasel->fssy-1, simasel->fsex+1, simasel->fsey+1,1);
- uiEmboss(simasel->fesx-1, simasel->fesy-1, simasel->feex+1, simasel->feey+1,1);
-
- if (simasel->imasli == 1){
- sx = simasel->imasli_sx;
- sy = simasel->imasli_ey - simasel->imasli_h;
- ex = simasel->imasli_ex;
- ey = simasel->imasli_ey;
-
- BIF_ThemeColor(TH_SHADE1);
+ if (numtiles > numfiles) numtiles = numfiles;
+
+ todo = 0;
+ if (lasttime < 0.001) lasttime = PIL_check_seconds_timer();
- glRecti(sx, sy, ex, ey);
- uiEmboss(sx, sy, ex, ey, 1);
- }
- info = 0;
- strcpy(infostr, "");
- if (simasel->totalima){
- viewgate(simasel->fesx, simasel->fesy, simasel->feex, simasel->feey);
-
- ima = simasel->first_sel_ima;
-
- while (ima){
- sc = 0;
-
- sx = ima->sx- 6; sy = ima->sy-20 + sc;
- ex = ima->sx+71; ey = ima->sy+70 + sc;
-
- if(ima->selected == 1){
- cpack(0xCC6666);
- glRecti(sx, sy, ex, ey);
- }
- if(ima->selectable == 1){
- if (ima->selected ) cpack(0xEE8888); else cpack(0x999999);
-
- if (((simasel->mode & 8) != 8) && (simasel->hilite_ima == ima)){
- glRecti(sx, sy, ex, ey); uiEmboss(sx,sy, ex,ey, 1);
- }
- if (ima->disksize/1000 > 1000){ sprintf(infostr, "%s %.2fMb x%i y%i %i bits ",ima->file_name,(ima->disksize/1024)/1024.0, ima->orgx, ima->orgy, ima->orgd);
- }else{ sprintf(infostr, "%s %dKb %ix%i %i bits ", ima->file_name,ima->disksize/1024, ima->orgx, ima->orgy, ima->orgd);
- }
- if (ima->anim == 1){ strcat (infostr, "movie"); }else{
- str_image_type(ima->ibuf_type, naam);
- strcat (infostr, naam);
- }
- info = 1;
+ if (simasel->numtilesx > 0) {
+ /* calculate the offset to start drawing */
+ if ((numtiles < numfiles) && (simasel->scrollarea > 0)) {
+ fileoffset = numfiles*( (simasel->scrollpos) / simasel->scrollarea) + 0.5;
+ } else {
+ fileoffset = 0;
+ }
+ rowoffset = (fileoffset / simasel->numtilesx)*simasel->numtilesx;
+ columnoffset = fileoffset % simasel->numtilesx;
+ scrollofs = (float)tileheight*(float)columnoffset/(float)simasel->numtilesx;
+ } else {
+ rowoffset = 0;
+ scrollofs = 0;
+ }
+ /* add partially visible row */
+ numtiles += simasel->numtilesx;
+ for (i=rowoffset, j=0 ; (i < numfiles) && (j < numtiles); ++i, ++j)
+ {
+ sx = simasel->v2d.cur.xmin + viewrect.xmin + (j % simasel->numtilesx)*tilewidth;
+ sy = simasel->v2d.cur.ymin + viewrect.ymax + (short)scrollofs - (viewrect.ymin + (j / simasel->numtilesx)*tileheight);
+
+ file = BIF_filelist_file(files, i);
+
+ if (simasel->active_file == i) {
+ colorid = TH_ACTIVE;
+ draw_tile(simasel, sx, sy, colorid);
+ } else if (file->flags & ACTIVE) {
+ colorid = TH_HILITE;
+ draw_tile(simasel, sx, sy, colorid);
+ } else {
+ /*
+ colorid = TH_PANEL;
+ draw_tile(simasel, sx, sy, colorid);
+ */
+ }
+
+ if ( type == FILE_MAIN) {
+ ID *id;
+ int icon_id = 0;
+ int idcode;
+ idcode= BIF_groupname_to_code(simasel->dir);
+ if (idcode == ID_MA || idcode == ID_TE || idcode == ID_LA || idcode == ID_WO || idcode == ID_IM) {
+ id = (ID *)file->poin;
+ icon_id = BKE_icon_getid(id);
+ }
+ if (icon_id) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (do_load) {
+ BIF_icon_draw_preview(sx+2*TILE_BORDER_X, sy-simasel->prv_w-TILE_BORDER_X, icon_id, 0);
+ } else {
+ BIF_icon_draw_preview(sx+2*TILE_BORDER_X, sy-simasel->prv_w-TILE_BORDER_X, icon_id, 1);
+ todo++;
}
- sx = ima->sx; sy = ima->sy + sc;
- ex = ima->ex; ey = ima->ey + sc;
-
- if (ima->anim == 0) BIF_ThemeColorShade(TH_SHADE1, -80);
- else BIF_ThemeColorShade(TH_SHADE1, -70);
-
- glRecti(sx, sy, ex, ey);
- uiEmboss(sx-1,sy-1, ex+1,ey+1, 1);
-
- cpack(0);
- strcpy(naam, ima->file_name);
- naam[11] = 0;
-
- glRasterPos2i(sx+32-BMF_GetStringWidth(G.fonts, naam) / 2 , sy-16);
- BMF_DrawString(G.fonts, naam);
-
- if ((ima) && (ima->pict) && (ima->pict->rect)){
- if ( (ey > simasel->fesy) && (sy < simasel->feey)){
- if(OLD_IMASEL) {
- lrectwrite(sx, sy, ex-1, ey-1, ima->pict->rect);
- } else
- rectwrite_imasel(simasel->fesx, simasel->fesy,
- curarea->winrct.xmax, curarea->winrct.ymax - 64, //simasel->feey*1.5,
- sx, sy, ima->pict->x, ima->pict->y, 1.0, 1.0, ima->pict->rect);
- }
+ glDisable(GL_BLEND);
+ }
+ }
+ else {
+ if ( (file->flags & IMAGEFILE) || (file->flags & MOVIEFILE))
+ {
+ if (do_load) {
+ BIF_filelist_loadimage(simasel->files, i);
+ } else {
+ todo++;
}
-
- ima = ima->next;
+ imb = BIF_filelist_getimage(simasel->files, i);
+ } else {
+ imb = BIF_filelist_getimage(simasel->files, i);
}
-
- if ((simasel->mode & 8) == 8) { /* if magnify */
-
- if (bitset(simasel->fase, IMS_KNOW_IMA) && (simasel->hilite_ima)) {
-
- ima = simasel->hilite_ima;
- glPixelZoom(2.0, 2.0);
-
- sx = ima->sx + (ima->ex - ima->sx)/2 - (ima->ex - ima->sx);
- sy = ima->sy + (ima->ey - ima->sy)/2 - (ima->ey - ima->sy);
-
- ex = sx + 2*(ima->ex - ima->sx);
- ey = sy + 2*(ima->ey - ima->sy);
-
- uiEmboss(sx-1,sy-1, ex+1,ey+1, 0);
-
- if(OLD_IMASEL) {
- lrectwrite(sx, sy, sx+ (ima->ex - ima->sx)-1, sy+ (ima->ey - ima->sy)-1, ima->pict->rect);
- } else
- rectwrite_imasel(simasel->fesx, simasel->fesy,
- curarea->winrct.xmax, curarea->winrct.ymax - 64, //simasel->feey*1.5,
- sx, sy, ima->pict->x, ima->pict->y, 2.0, 2.0, ima->pict->rect);
+
+ if (imb) {
+ float fx = ((float)simasel->prv_w - (float)imb->x)/2.0f;
+ float fy = ((float)simasel->prv_h - (float)imb->y)/2.0f;
+ short dx = (short)(fx + 0.5f);
+ short dy = (short)(fy + 0.5f);
- glPixelZoom(1.0, 1.0);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ // glaDrawPixelsSafe((float)sx+8 + dx, (float)sy - imgwidth + dy - 8, imb->x, imb->y, imb->x, GL_RGBA, GL_UNSIGNED_BYTE, imb->rect);
+ glColor4f(1.0, 1.0, 1.0, 1.0);
+ glaDrawPixelsTex((float)sx+2*TILE_BORDER_X + dx, (float)sy - simasel->prv_h + dy - 2*TILE_BORDER_Y, imb->x, imb->y,GL_UNSIGNED_BYTE, imb->rect);
+ // glDisable(GL_BLEND);
+ imb = 0;
+ }
+ }
+
+ if (type == FILE_MAIN) {
+ glColor3f(1.0f, 1.0f, 1.0f);
+ }
+ else {
+ if (S_ISDIR(file->type)) {
+ glColor3f(1.0f, 1.0f, 0.9f);
+ }
+ else if (file->flags & IMAGEFILE) {
+ BIF_ThemeColor(TH_SEQ_IMAGE);
+ }
+ else if (file->flags & MOVIEFILE) {
+ BIF_ThemeColor(TH_SEQ_MOVIE);
+ }
+ else if (file->flags & BLENDERFILE) {
+ BIF_ThemeColor(TH_SEQ_SCENE);
+ }
+ else {
+ if (simasel->active_file == i) {
+ BIF_ThemeColor(TH_GRID); /* grid used for active text */
+ } else if (file->flags & ACTIVE) {
+ BIF_ThemeColor(TH_TEXT_HI);
+ } else {
+ BIF_ThemeColor(TH_TEXT);
}
}
- areaview(); /* reset viewgate */
}
-
-
- /* INFO */
- if (simasel->infsx > 0){
- BIF_ThemeColorShade(TH_SHADE1, -80);
-
- glRecti(simasel->infsx, simasel->infsy, simasel->infex, simasel->infey);
- uiEmboss(simasel->infsx, simasel->infsy, simasel->infex, simasel->infey,1);
-
- if ((info)&&(strlen(infostr) > 0)){
-
- sx = curarea->winrct.xmin;
- sy = curarea->winrct.ymin;
-
- viewgate(simasel->infsx, simasel->infsy, simasel->infex, simasel->infey);
- cpack(0xAAAAAA);
- glRasterPos2i(simasel->infsx+4, simasel->infsy+6);
- BMF_DrawString(G.font, infostr);
-
- areaview(); /* reset viewgate */
-
- }
- }
-
- extrabutsize= (simasel->returnfunc)?60:0;
- if (simasel->dnw > extrabutsize+8) {
- simasel->dnw-= extrabutsize;
- uiDefBut(block, TEX, 1,"", simasel->dnsx, simasel->dnsy, simasel->dnw, simasel->dnh, simasel->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
- if (extrabutsize)
- uiDefBut(block, BUT, 5, "Load", simasel->dnsx+simasel->dnw, simasel->dnsy, extrabutsize, 21, NULL, 0.0, 0.0, 0, 0, "Load the selected image");
- }
- if (simasel->fnw > extrabutsize+8) {
- simasel->fnw-= extrabutsize;
- uiDefBut(block, TEX, 2,"", simasel->fnsx, simasel->fnsy, simasel->fnw, simasel->fnh, simasel->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
- if (extrabutsize)
- uiDefBut(block, BUT, 6, "Cancel", simasel->fnsx+simasel->fnw, simasel->fnsy, extrabutsize, 21, NULL, 0.0, 0.0, 0, 0, "Cancel image loading");
+ draw_file(simasel, sx, sy, file);
+
+ if(do_load && (PIL_check_seconds_timer() - lasttime > 0.3)) {
+ lasttime= PIL_check_seconds_timer();
+ do_load = 0;
}
}
-
- if (curarea->winx > 16) {
- char *menu= fsmenu_build_menu();
-
- uiDefBut(block, BUT, 13, "P", 8, (short)(curarea->winy-29), 20, 21, 0, 0, 0, 0, 0, "");
- uiDefButS(block, MENU, 3 , menu, 8, (short)(curarea->winy-58), 20, 21, &simasel->fileselmenuitem, 0, 0, 0, 0, "");
- MEM_freeN(menu);
- }
-
- uiDrawBlock(block);
+ if (!do_load && todo > 0) /* we broke off loading */
+ addafterqueue(sa->win, RENDERPREVIEW, 1);
}
-void select_ima_files(SpaceImaSel *simasel)
+
+/* in panel space! */
+static void imasel_imgdraw(ScrArea *sa, uiBlock *block)
{
- short set_reset;
- short mval[2], oval[2];
-
- set_reset = 1 - (simasel->hilite_ima->selected);
-
- getmouseco_areawin(mval);
- oval[0] = mval[0] + 1;
- oval[1] = 0; /* Just give it a value to stop warnings */
-
- while(get_mbut()&R_MOUSE) {
- getmouseco_areawin(mval);
- if ((oval[0] != mval[0]) || (oval[1] != mval[1])){
- simasel->mx = mval[0];
- simasel->my = mval[1];
-
- calc_hilite(simasel);
-
- if (simasel->hilite_ima){
- simasel->hilite_ima->selected = set_reset;
- scrarea_do_windraw(curarea);
- screen_swapbuffers();
+ SpaceImaSel *simasel= sa->spacedata.first;
+ rctf dispf;
+ rcti winrect;
+ struct direntry *file;
+ char path[FILE_MAX];
+ float tsize;
+ short ofsx=0;
+ short ofsy=0;
+ short ex, ey;
+ float scaledx, scaledy;
+ int index;
+
+ BLI_init_rctf(&dispf, 0.0f, (block->maxx - block->minx)-0.0f, 0.0f, (block->maxy - block->miny)-0.0f);
+ ui_graphics_to_window_rct(sa->win, &dispf, &winrect);
+
+ if (!simasel->img) {
+ BLI_join_dirfile(path, simasel->dir, simasel->file);
+ if (!BLI_exists(path))
+ return;
+
+ index = BIF_filelist_find(simasel->files, simasel->file);
+ if (index >= 0) {
+ file = BIF_filelist_file(simasel->files,index);
+ if (file->flags & IMAGEFILE || file->flags & MOVIEFILE) {
+ simasel->img = IMB_loadiffname(path, IB_rect);
+
+ if (simasel->img) {
+ tsize = MIN2(winrect.xmax - winrect.xmin,winrect.ymax - winrect.ymin);
+
+ if (simasel->img->x > simasel->img->y) {
+ scaledx = (float)tsize;
+ scaledy = ( (float)simasel->img->y/(float)simasel->img->x )*tsize;
+ ofsy = (scaledx - scaledy) / 2.0;
+ ofsx = 0;
+ }
+ else {
+ scaledy = (float)tsize;
+ scaledx = ( (float)simasel->img->x/(float)simasel->img->y )*tsize;
+ ofsx = (scaledy - scaledx) / 2.0;
+ ofsy = 0;
+ }
+ ex = (short)scaledx;
+ ey = (short)scaledy;
+
+ IMB_scaleImBuf(simasel->img, ex, ey);
+ }
}
- oval[0] = mval[0];
- oval[1] = mval[1];
}
}
+ if (simasel->img == NULL)
+ return;
+ if(simasel->img->rect==NULL)
+ return;
+
+ /* correction for gla draw */
+ BLI_translate_rcti(&winrect, -curarea->winrct.xmin, -curarea->winrct.ymin);
+
+ glaDefine2DArea(&sa->winrct);
+ glaDrawPixelsSafe(winrect.xmin+ofsx, winrect.ymin+ofsy, simasel->img->x, simasel->img->y, simasel->img->x, GL_RGBA, GL_UNSIGNED_BYTE, simasel->img->rect);
}
-void move_imadir_sli(SpaceImaSel *simasel)
+static void imasel_panel_image(ScrArea *sa, short cntrl)
{
-
- short mval[2], lval[2], fh;
- float rh;
-
- getmouseco_areawin(mval);
-
- if ((mval[0] > simasel->dirsli_sx) &&
- (mval[0] < simasel->dirsli_ex) &&
- (mval[1] > simasel->dirsli_ey - simasel->dirsli_h) &&
- (mval[1] < simasel->dirsli_ey) ){
-
- /* extactly in the slider */
- fh = simasel->dirsli_ey - mval[1];
- lval[1]=1;
- while(get_mbut()&L_MOUSE) {
- getmouseco_areawin(mval);
- if (mval[1] != lval[1]){
-
- rh = (float)(simasel->dsey - mval[1] - fh - simasel->dssy) / (simasel->dsdh - simasel->dirsli_h);
-
- simasel->topdir = 1 + rh * (simasel->totaldirs - simasel->dirsli_lines);
-
- scrarea_do_windraw(curarea);
- uiEmboss(simasel->dirsli_sx, simasel->dirsli_ey - simasel->dirsli_h,
- simasel->dirsli_ex, simasel->dirsli_ey,1);
- screen_swapbuffers();
- lval[1] = mval[1];
- }
- }
- }else{
- if (mval[1] < simasel->dirsli_ey - simasel->dirsli_h)
- simasel->topdir += (simasel->dirsli_lines - 1);
- else
- simasel->topdir -= (simasel->dirsli_lines - 1);
-
- while(get_mbut()&L_MOUSE) { }
+ uiBlock *block;
+ SpaceImaSel *simasel= sa->spacedata.first;
+ short w = 300;
+ short h = 300;
+ short offsx, offsy;
+
+ if (simasel->img) {
+ w = simasel->img->x;
+ h = simasel->img->y;
}
+
+ offsx = -150 + (simasel->v2d.mask.xmax - simasel->v2d.mask.xmin)/2;
+ offsy = -150 + (simasel->v2d.mask.ymax - simasel->v2d.mask.ymin)/2;
+
+ block= uiNewBlock(&curarea->uiblocks, "imasel_panel_image", UI_EMBOSS, UI_HELV, curarea->win);
+ uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
+ uiSetPanelHandler(IMASEL_HANDLER_IMAGE); // for close and esc
+ if(uiNewPanel(curarea, block, "Image Preview", "Image Browser", offsx, offsy, w, h)==0)
+ return;
+ uiBlockSetDrawExtraFunc(block, imasel_imgdraw);
}
-void move_imafile_sli(SpaceImaSel *simasel)
+static void imasel_blockhandlers(ScrArea *sa)
{
- short mval[2], cmy, omy = 0;
- short ssl, sdh, ssv;
-
- getmouseco_areawin(mval);
- cmy = mval[1];
-
- if ((mval[0] > simasel->imasli_sx) &&
- (mval[0] < simasel->imasli_ex) &&
- (mval[1] > simasel->imasli_ey - simasel->imasli_h) &&
- (mval[1] < simasel->imasli_ey) ){
+ SpaceImaSel *simasel= sa->spacedata.first;
+ short a;
- ssv = simasel->fsey - simasel->imasli_ey - 2;
+ for(a=0; a<SPACE_MAXHANDLER; a+=2) {
+ switch(simasel->blockhandler[a]) {
+
+ case IMASEL_HANDLER_IMAGE:
+ imasel_panel_image(sa, simasel->blockhandler[a+1]);
+ break;
- while(get_mbut() & L_MOUSE) {
- getmouseco_areawin(mval);
- if (mval[1] != omy){
- sdh = simasel->fsdh - simasel->imasli_h;
- ssl = cmy - mval[1] + ssv;
-
- if (ssl < 0) { ssl = 0; }
- if (ssl > sdh) { ssl = sdh; }
-
- simasel->image_slider = ssl / (float)sdh;
-
- scrarea_do_windraw(curarea);
- uiEmboss(simasel->imasli_sx, simasel->imasli_ey - simasel->imasli_h,
- simasel->imasli_ex, simasel->imasli_ey, 1);
-
- screen_swapbuffers();
- omy = mval[1];
- }
}
- }else{
- while(get_mbut() & L_MOUSE) { }
+ /* clear action value for event */
+ simasel->blockhandler[a+1]= 0;
}
+ uiDrawBlocksPanels(sa, 0);
}
-void ima_select_all(SpaceImaSel *simasel)
+
+static void draw_imasel_buttons(ScrArea *sa, SpaceImaSel* simasel)
{
- OneSelectableIma *ima;
- int reselect = 0;
-
- ima = simasel->first_sel_ima;
- if (!ima) return;
-
- while(ima){
- if (ima->selected == 1) reselect = 1;
- ima = ima->next;
- }
- ima = simasel->first_sel_ima;
- if (reselect == 1){
- while(ima){
- ima->selected = 0;
- ima = ima->next;
- }
- }else{
- while(ima){
- ima->selected = 1;
- ima = ima->next;
+ uiBlock *block;
+ int loadbutton;
+ char name[20];
+ char *menu;
+ float slen;
+ float parentbut_width = 20;
+ float bookmarkbut_width = 0.0f;
+ int filebuty1, filebuty2;
+
+ float xmin = simasel->v2d.mask.xmin + 10;
+ float xmax = simasel->v2d.mask.xmax - 10;
+
+ filebuty1= simasel->v2d.mask.ymax - IMASEL_BUTTONS_HEIGHT;
+ filebuty2= filebuty1+IMASEL_BUTTONS_HEIGHT/2 -6;
+
+ /* HEADER */
+ sprintf(name, "win %d", sa->win);
+ block = uiNewBlock(&sa->uiblocks, name, UI_EMBOSS, UI_HELV, sa->win);
+
+ uiSetButLock( BIF_filelist_gettype(simasel->files)==FILE_MAIN && simasel->returnfunc, NULL);
+
+ /* space available for load/save buttons? */
+ slen = BIF_GetStringWidth(G.font, simasel->title, simasel->aspect);
+ loadbutton= slen > 60 ? slen + 20 : 80; /* MAX2(80, 20+BIF_GetStringWidth(G.font, simasel->title)); */
+ if(simasel->v2d.mask.xmax-simasel->v2d.mask.xmin > loadbutton+20) {
+ if(simasel->title[0]==0) {
+ loadbutton= 0;
}
}
-}
+ else {
+ loadbutton= 0;
+ }
-void pibplay(SpaceImaSel *simasel)
-{
- OneSelectableIma *ima;
- int sx= 8, sy= 8;
-
- ima = simasel->first_sel_ima;
- if (!ima) return ;
-
- sx = curarea->winrct.xmin + 8;
- sy = curarea->winrct.ymin + 8;
-
- while(!(get_mbut()&L_MOUSE)){
- scrarea_do_windraw(curarea);
-
- lrectwrite(sx, sy, sx+ima->dw-1, sy+ima->dh-1, ima->pict->rect);
-
- ima = ima->next;
- if (!ima) ima = simasel->first_sel_ima;
- screen_swapbuffers();
+ menu= fsmenu_build_menu();
+
+ if (menu[0]) {
+ bookmarkbut_width = parentbut_width;
+ }
+
+ uiDefBut(block, TEX, B_FS_FILENAME,"", xmin+parentbut_width+bookmarkbut_width+2, filebuty1, xmax-xmin-loadbutton-parentbut_width-bookmarkbut_width, 21, simasel->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+ uiDefBut(block, TEX, B_FS_DIRNAME,"", xmin+parentbut_width, filebuty2, xmax-xmin-loadbutton-parentbut_width, 21, simasel->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+
+ if(loadbutton) {
+ uiSetCurFont(block, UI_HELV);
+ uiDefBut(block, BUT,B_FS_LOAD, simasel->title, xmax-loadbutton, filebuty2, loadbutton, 21, simasel->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+ uiDefBut(block, BUT,B_FS_CANCEL, "Cancel", xmax-loadbutton, filebuty1, loadbutton, 21, simasel->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
}
+
+ if(menu[0]) { // happens when no .Bfs is there, and first time browse
+ uiDefButS(block, MENU,B_FS_DIR_MENU, menu, xmin, filebuty1, parentbut_width, 21, &simasel->menu, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_FS_BOOKMARK, "B", xmin+22, filebuty1, bookmarkbut_width, 21, 0, 0, 0, 0, 0, "Bookmark current directory");
+ }
+ MEM_freeN(menu);
+
+ uiDefBut(block, BUT, B_FS_PARDIR, "P", xmin, filebuty2, parentbut_width, 21, 0, 0, 0, 0, 0, "Move to the parent directory (PKEY)");
+
+ uiDrawBlock(block);
}
@@ -860,65 +662,71 @@ void pibplay(SpaceImaSel *simasel)
void drawimaselspace(ScrArea *sa, void *spacedata)
{
- SpaceImaSel *simasel;
- simasel= curarea->spacedata.first;
+ float col[3];
+ SpaceImaSel *simasel= curarea->spacedata.first;
- /* ortho: xmin xmax, ymin, ymax! */
- myortho2(-0.375, (float)(curarea->winx)-0.375, -0.375, (float)(curarea->winy)-0.375);
+ BIF_GetThemeColor3fv(TH_BACK, col);
+ glClearColor(col[0], col[1], col[2], 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
- if (simasel->fase == 0){
- BLI_cleanup_dir(G.sce, simasel->dir);
- clear_ima_dir(simasel);
- }
+ /* HACK: somehow when going fullscreen, v2d isn't set correctly */
+ simasel->v2d.cur.xmin= simasel->v2d.cur.ymin= 0.0f;
+ simasel->v2d.cur.xmax= sa->winx;
+ simasel->v2d.cur.ymax= sa->winy;
+ simasel->v2d.tot= simasel->v2d.cur;
+ test_view2d(G.v2d, sa->winx, sa->winy);
- if (!bitset(simasel->fase, IMS_KNOW_DIR)){
- if(simasel->firstdir) free_ima_dir(simasel->firstdir);
- if(simasel->firstfile) free_ima_dir(simasel->firstfile);
- simasel->firstdir = 0;
- simasel->firstfile = 0;
+ calc_imasel_rcts(simasel, sa->winx, sa->winy);
+
+ myortho2(simasel->v2d.cur.xmin, simasel->v2d.cur.xmax, simasel->v2d.cur.ymin, simasel->v2d.cur.ymax);
+ bwin_clear_viewmat(sa->win); /* clear buttons view */
+ glLoadIdentity();
- if (get_ima_dir(simasel->dir, IMS_DIR, &simasel->totaldirs, &simasel->firstdir) < 0){
- /* error */
- strcpy(simasel->dir, simasel->dor);
- get_ima_dir(simasel->dir, IMS_DIR, &simasel->totaldirs, &simasel->firstdir);
- }
-
- if (get_ima_dir(simasel->dir, IMS_FILE, &simasel->totalfiles, &simasel->firstfile) < 0){
- /* error */
- strcpy(simasel->file, simasel->fole);
- get_ima_dir(simasel->dir, IMS_FILE, &simasel->totalfiles, &simasel->firstfile);
- }
-
- simasel->topdir = 0;
- simasel->topfile = 0;
- simasel->fase |= IMS_KNOW_DIR;
-
- check_for_pib(simasel);
-
- strcpy(simasel->fole, simasel->file);
- strcpy(simasel->dor, simasel->dir);
- }
-
- if (!bitset(simasel->fase, IMS_FOUND_BIP)){
- /* Make the first Bip file ever in this directory */
- if ( !bitset(simasel->fase, IMS_KNOW_INF)){
- if (!bitset(simasel->fase, IMS_DOTHE_INF)){
- if(simasel->first_sel_ima) free_sel_ima(simasel->first_sel_ima);
- simasel->first_sel_ima = 0;
- simasel->fase |= IMS_DOTHE_INF;
- addafterqueue(curarea->win, AFTERIMASELIMA, 1);
- }
- }
- }else{
- if (!bitset(simasel->fase, IMS_KNOW_BIP)){
- addafterqueue(curarea->win, AFTERPIBREAD, 1);
- }
+ /* warning; blocks need to be freed each time, handlers dont remove */
+ uiFreeBlocksWin(&sa->uiblocks, sa->win);
+
+ /* aspect+font, set each time */
+ simasel->aspect= (simasel->v2d.cur.xmax - simasel->v2d.cur.xmin)/((float)sa->winx);
+ simasel->curfont= uiSetCurFont_ext(simasel->aspect);
+
+ if (!simasel->files) {
+ simasel->files = BIF_filelist_new();
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ BIF_filelist_settype(simasel->files, simasel->type);
}
+
+ /* Buttons */
+ draw_imasel_buttons(sa, simasel);
- make_sima_area(simasel);
- calc_hilite(simasel);
- draw_sima_area(simasel);
+ /* scrollbar */
+ draw_imasel_scroll(simasel);
+
+ /* bookmarks */
+ draw_imasel_bookmarks(sa, simasel);
+
+ uiEmboss(simasel->viewrect.xmin, simasel->viewrect.ymin, simasel->v2d.mask.xmax-TILE_BORDER_X, simasel->viewrect.ymax, 1);
+
+
+ glScissor(sa->winrct.xmin + simasel->viewrect.xmin ,
+ sa->winrct.ymin + simasel->viewrect.ymin,
+ simasel->viewrect.xmax - simasel->viewrect.xmin ,
+ simasel->viewrect.ymax - simasel->viewrect.ymin);
+
+ /* previews */
+ draw_imasel_previews(sa, simasel);
+ /* BIF_ThemeColor(TH_HEADER);*/
+ /* glRecti(simasel->viewrect.xmin, simasel->viewrect.ymin, simasel->viewrect.xmax, simasel->viewrect.ymax);*/
+
+ /* restore viewport (not needed yet) */
+ mywinset(sa->win);
+
+ /* ortho at pixel level curarea */
+ myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
+
+ draw_area_emboss(sa);
+
+ imasel_blockhandlers(sa);
+
curarea->win_swap= WIN_BACK_OK;
}
-