Fix [#20908] Box Select On File/Append Selects Too Many Files
authorMatt Ebb <matt@mke3.net>
Thu, 18 Mar 2010 04:09:59 +0000 (04:09 +0000)
committerMatt Ebb <matt@mke3.net>
Thu, 18 Mar 2010 04:09:59 +0000 (04:09 +0000)
source/blender/editors/include/ED_fileselect.h
source/blender/editors/space_file/file_draw.c
source/blender/editors/space_file/file_ops.c
source/blender/editors/space_file/filesel.c

index 52d6fe479fae1cfef5870e7288f5b01f0f31f8ca..8d7184902eb4ecb5e935d0d36cc73961a3f6a854 100644 (file)
@@ -83,7 +83,7 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar);
 FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar);
 
 int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar);
-int ED_fileselect_layout_offset(FileLayout* layout, int x, int y);
+int ED_fileselect_layout_offset(FileLayout* layout, int clamp_bounds, int x, int y);
 
 void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, int *x, int *y);
 
index 63729f03e581c4d8191b83277f372803f9cbd9a8..6259199d3171f4337aae6abda2822a3f4b7bf4d9 100644 (file)
@@ -518,7 +518,7 @@ void file_draw_list(const bContext *C, ARegion *ar)
                draw_dividers(layout, v2d);
        }
 
-       offset = ED_fileselect_layout_offset(layout, ar->v2d.cur.xmin, -ar->v2d.cur.ymax);
+       offset = ED_fileselect_layout_offset(layout, 0, ar->v2d.cur.xmin, -ar->v2d.cur.ymax);
        if (offset<0) offset=0;
 
        numfiles_layout = ED_fileselect_layout_numfiles(layout, ar);
index ab259f1e1cb563a8c26346a2f5c0a9e5d007dd13..baf7e42bb633dbe02b00539d644d82d55fd25146 100644 (file)
@@ -69,7 +69,7 @@
 
 /* ---------- FILE SELECTION ------------ */
 
-static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, int x, int y)
+static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, int clamp_bounds, int x, int y)
 {
        float fx,fy;
        int active_file = -1;
@@ -77,7 +77,7 @@ static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, int x, int y)
 
        UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
 
-       active_file = ED_fileselect_layout_offset(sfile->layout, v2d->tot.xmin + fx, v2d->tot.ymax - fy);
+       active_file = ED_fileselect_layout_offset(sfile->layout, clamp_bounds, v2d->tot.xmin + fx, v2d->tot.ymax - fy);
        
        return active_file;
 }
@@ -138,10 +138,10 @@ static FileSelect file_select(bContext* C, const rcti* rect, short selecting, sh
        // FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
 
        int numfiles = filelist_numfiles(sfile->files);
-
+       
        params->selstate = NOTACTIVE;
-       first_file = find_file_mouse(sfile, ar, rect->xmin, rect->ymax);
-       last_file = find_file_mouse(sfile, ar, rect->xmax, rect->ymin);
+       first_file = find_file_mouse(sfile, ar, 1, rect->xmin, rect->ymax);
+       last_file = find_file_mouse(sfile, ar, 1, rect->xmax, rect->ymin);
        
        clamp_to_filelist(numfiles, &first_file, &last_file);
 
@@ -206,10 +206,9 @@ static FileSelect file_select(bContext* C, const rcti* rect, short selecting, sh
 static int file_border_select_exec(bContext *C, wmOperator *op)
 {
        ARegion *ar= CTX_wm_region(C);
-       SpaceFile *sfile= CTX_wm_space_file(C);
        short selecting;
        rcti rect;
-
+       
        selecting= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT);
        rect.xmin= RNA_int_get(op->ptr, "xmin");
        rect.ymin= RNA_int_get(op->ptr, "ymin");
@@ -452,7 +451,7 @@ int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
        my -= ar->winrct.ymin;
 
        if(BLI_in_rcti(&ar->v2d.mask, mx, my)) {
-               actfile = find_file_mouse(sfile, ar, mx , my);
+               actfile = find_file_mouse(sfile, ar, 0, mx , my);
 
                if((actfile >= 0) && (actfile < numfiles))
                        params->active_file=actfile;
@@ -662,8 +661,6 @@ void FILE_OT_parent(struct wmOperatorType *ot)
 
 int file_refresh_exec(bContext *C, wmOperator *unused)
 {
-       SpaceFile *sfile= CTX_wm_space_file(C);
-       
        file_change_dir(C, 1);
 
        WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
index 6945e8c959a12c33331ad977a8958c457d800775..da8dc4b654cd652e095a621885f94e34b382e1b8 100644 (file)
@@ -220,7 +220,7 @@ int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar)
        }
 }
 
-int ED_fileselect_layout_offset(FileLayout* layout, int x, int y)
+int ED_fileselect_layout_offset(FileLayout* layout, int clamp_bounds, int x, int y)
 {
        int offsetx, offsety;
        int active_file;
@@ -231,9 +231,14 @@ int ED_fileselect_layout_offset(FileLayout* layout, int x, int y)
        offsetx = (x)/(layout->tile_w + 2*layout->tile_border_x);
        offsety = (y)/(layout->tile_h + 2*layout->tile_border_y);
        
-       if (offsetx > layout->columns-1) return -1 ;
-       if (offsety > layout->rows-1) return -1 ;
-
+       if (clamp_bounds) {
+               CLAMP(offsetx, 0, layout->columns-1);
+               CLAMP(offsety, 0, layout->rows-1);
+       } else {
+               if (offsetx > layout->columns-1) return -1 ;
+               if (offsety > layout->rows-1) return -1 ;
+       }
+       
        if (layout->flag & FILE_LAYOUT_HOR) 
                active_file = layout->rows*offsetx + offsety;
        else