[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35654] trunk/blender/source/blender/ editors/space_file: == file browser == Code cleanup

Vekoon vekoon at gmail.com
Mon Mar 21 01:43:47 CET 2011


Watch out here, you removed the initialization of the "file" variable in
many places where it's not just used to access the selection flag but also
to get the filename (file->relname).

E.g.

-                               file = filelist_file(sfile->files, i);
-                               if(file->selflag & SELECTED_FILE) {
-                                       if ((file->type & S_IFDIR)==0) {
-                                               RNA_collection_add(op->ptr,
"files", &itemptr);
-                                               RNA_string_set(&itemptr,
"name", file->relname);
-                                       }
+                               if (filelist_is_selected(sfile->files, i,
SELECTED_FILE, CHECK_FILES)) {
+                                       RNA_collection_add(op->ptr, "files",
&itemptr);
+                                       RNA_string_set(&itemptr, "name",
file->relname);


On Sun, Mar 20, 2011 at 3:15 PM, Andrea Weikert <elubie at gmx.net> wrote:

> Revision: 35654
>
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35654
> Author:   elubie
> Date:     2011-03-20 15:15:05 +0000 (Sun, 20 Mar 2011)
> Log Message:
> -----------
> == file browser == Code cleanup
> * Remove direct access to file->selflag in file_ops.c
>
> Modified Paths:
> --------------
>    trunk/blender/source/blender/editors/space_file/file_ops.c
>    trunk/blender/source/blender/editors/space_file/filelist.c
>    trunk/blender/source/blender/editors/space_file/filelist.h
>
> Modified: trunk/blender/source/blender/editors/space_file/file_ops.c
> ===================================================================
> --- trunk/blender/source/blender/editors/space_file/file_ops.c  2011-03-20
> 15:03:13 UTC (rev 35653)
> +++ trunk/blender/source/blender/editors/space_file/file_ops.c  2011-03-20
> 15:15:05 UTC (rev 35654)
> @@ -91,15 +91,11 @@
>
>  static void file_deselect_all(SpaceFile* sfile, unsigned int flag)
>  {
> -       int numfiles = filelist_numfiles(sfile->files);
> -       int i;
> -
> -       for ( i=0; i < numfiles; ++i) {
> -               struct direntry* file = filelist_file(sfile->files, i);
> -               if (file && (file->selflag & flag)) {
> -                       file->selflag &= ~flag;
> -               }
> -       }
> +       FileSelection sel;
> +       sel.first = 0;
> +       sel.last = filelist_numfiles(sfile->files)-1;
> +
> +       filelist_select(sfile->files, &sel, FILE_SEL_REMOVE, flag,
> CHECK_ALL);
>  }
>
>  typedef enum FileSelect {
> @@ -150,8 +146,7 @@
>        if (fill && (sel.last >= 0) && (sel.last < numfiles) ) {
>                int f= sel.last;
>                while (f >= 0) {
> -                       struct direntry* file = filelist_file(sfile->files,
> f);
> -                       if (file->selflag & SELECTED_FILE)
> +                       if ( filelist_is_selected(sfile->files, f,
> SELECTED_FILE, CHECK_ALL) )
>                                break;
>                        f--;
>                }
> @@ -210,10 +205,9 @@
>        SpaceFile *sfile= CTX_wm_space_file(C);
>        FileSelect retval = FILE_SELECT_NOTHING;
>        FileSelection sel= file_selection_get(C, rect, fill); /* get the
> selection */
> -       struct direntry *file;
>
>        /* flag the files as selected in the filelist */
> -       filelist_select(sfile->files, &sel, select, SELECTED_FILE);
> +       filelist_select(sfile->files, &sel, select, SELECTED_FILE,
> CHECK_ALL);
>
>        /* Don't act on multiple selected files */
>        if (sel.first != sel.last) select = 0;
> @@ -222,8 +216,7 @@
>        if ( (sel.last >= 0) && ((select == FILE_SEL_ADD) || (select ==
> FILE_SEL_TOGGLE)) )
>        {
>                /* Check last selection, if selected, act on the file or dir
> */
> -               file = filelist_file(sfile->files, sel.last);
> -               if (file && (file->selflag & SELECTED_FILE)) {
> +               if (filelist_is_selected(sfile->files, sel.last,
> SELECTED_FILE, CHECK_ALL)) {
>                        retval = file_select_do(C, sel.last);
>                }
>        }
> @@ -258,7 +251,7 @@
>                sel = file_selection_get(C, &rect, 0);
>                if ( (sel.first != params->sel_first) || (sel.last !=
> params->sel_last) ) {
>                        file_deselect_all(sfile, HILITED_FILE);
> -                       filelist_select(sfile->files, &sel, FILE_SEL_ADD,
> HILITED_FILE);
> +                       filelist_select(sfile->files, &sel, FILE_SEL_ADD,
> HILITED_FILE, CHECK_ALL);
>                        WM_event_add_notifier(C,
> NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
>                }
>                params->sel_first = sel.first; params->sel_last = sel.last;
> @@ -366,29 +359,28 @@
>  {
>        ScrArea *sa= CTX_wm_area(C);
>        SpaceFile *sfile= CTX_wm_space_file(C);
> +       FileSelection sel;
>        int numfiles = filelist_numfiles(sfile->files);
>        int i;
> -       int select = 1;
> +       int is_selected = 0;
> +
> +       sel.first = 0;
> +       sel.last = numfiles-1;
>
> -       /* if any file is selected, deselect all first */
> +       /* Is any file selected ? */
>        for ( i=0; i < numfiles; ++i) {
> -               struct direntry* file = filelist_file(sfile->files, i);
> -               if (file && (file->selflag & SELECTED_FILE)) {
> -                       file->selflag &= ~SELECTED_FILE;
> -                       select = 0;
> -                       ED_area_tag_redraw(sa);
> +               if (filelist_is_selected(sfile->files, i, SELECTED_FILE,
> CHECK_ALL)) {
> +                       is_selected = 1;
> +                       break;
>                }
>        }
>        /* select all only if previously no file was selected */
> -       if (select) {
> -               for ( i=0; i < numfiles; ++i) {
> -                       struct direntry* file = filelist_file(sfile->files,
> i);
> -                       if(file && !S_ISDIR(file->type)) {
> -                               file->selflag |= SELECTED_FILE;
> -                               ED_area_tag_redraw(sa);
> -                       }
> -               }
> +       if (is_selected) {
> +               filelist_select(sfile->files, &sel, FILE_SEL_REMOVE,
> SELECTED_FILE, CHECK_ALL);
> +       } else {
> +               filelist_select(sfile->files, &sel, FILE_SEL_ADD,
> SELECTED_FILE, CHECK_FILES);
>        }
> +       ED_area_tag_redraw(sa);
>        return OPERATOR_FINISHED;
>  }
>
> @@ -630,27 +622,23 @@
>                struct direntry *file;
>                if(RNA_struct_find_property(op->ptr, "files")) {
>                        for (i=0; i<numfiles; i++) {
> -                               file = filelist_file(sfile->files, i);
> -                               if(file->selflag & SELECTED_FILE) {
> -                                       if ((file->type & S_IFDIR)==0) {
> -                                               RNA_collection_add(op->ptr,
> "files", &itemptr);
> -                                               RNA_string_set(&itemptr,
> "name", file->relname);
> -                                       }
> +                               if (filelist_is_selected(sfile->files, i,
> SELECTED_FILE, CHECK_FILES)) {
> +                                       RNA_collection_add(op->ptr,
> "files", &itemptr);
> +                                       RNA_string_set(&itemptr, "name",
> file->relname);
>                                }
>                        }
>                }
>
>                if(RNA_struct_find_property(op->ptr, "dirs")) {
>                        for (i=0; i<numfiles; i++) {
> -                               file = filelist_file(sfile->files, i);
> -                               if(file->selflag & SELECTED_FILE) {
> -                                       if ((file->type & S_IFDIR)) {
> -                                               RNA_collection_add(op->ptr,
> "dirs", &itemptr);
> -                                               RNA_string_set(&itemptr,
> "name", file->relname);
> -                                       }
> +                               if (filelist_is_selected(sfile->files, i,
> SELECTED_FILE, CHECK_DIRS)) {
> +                                       RNA_collection_add(op->ptr, "dirs",
> &itemptr);
> +                                       RNA_string_set(&itemptr, "name",
> file->relname);
>                                }
>                        }
>                }
> +
> +
>        }
>  }
>
> @@ -728,12 +716,11 @@
>                 to prevent closing when doubleclicking on .. item */
>                if (RNA_boolean_get(exec_op->ptr, "need_active")) {
>                        int i, active=0;
> -                       struct direntry *file;
>
>                        for (i=0; i<filelist_numfiles(sfile->files); i++) {
> -                               file = filelist_file(sfile->files, i);
> -                               if(file->selflag & SELECTED_FILE) {
> +                               if(filelist_is_selected(sfile->files, i,
> SELECTED_FILE, CHECK_ALL)) {
>                                        active=1;
> +                                       break;
>                                }
>                        }
>                        if (active == 0)
> @@ -896,8 +883,7 @@
>        /* check if we are editing a name */
>        for (i=0; i < numfiles; ++i)
>        {
> -               struct direntry *file = filelist_file(sfile->files, i);
> -               if (file->selflag & EDITING_FILE) {
> +               if (filelist_is_selected(sfile->files, i, EDITING_FILE,
> CHECK_ALL) ) {
>                        edit_idx=i;
>                        break;
>                }
> @@ -1300,7 +1286,7 @@
>                int numfiles = filelist_numfiles(sfile->files);
>                if ( (0<=idx) && (idx<numfiles) ) {
>                        struct direntry *file= filelist_file(sfile->files,
> idx);
> -                       file->selflag |= EDITING_FILE;
> +                       filelist_select_file(sfile->files, idx,
> FILE_SEL_ADD, EDITING_FILE, CHECK_ALL);
>                        BLI_strncpy(sfile->params->renameedit,
> file->relname, FILE_MAXFILE);
>                        sfile->params->renamefile[0]= '\0';
>                }
>
> Modified: trunk/blender/source/blender/editors/space_file/filelist.c
> ===================================================================
> --- trunk/blender/source/blender/editors/space_file/filelist.c  2011-03-20
> 15:03:13 UTC (rev 35653)
> +++ trunk/blender/source/blender/editors/space_file/filelist.c  2011-03-20
> 15:15:05 UTC (rev 35654)
> @@ -906,34 +906,22 @@
>        filelist_readdir(filelist);
>  }
>
> -
> -void filelist_swapselect(struct FileList* filelist)
> +void filelist_select_file(struct FileList* filelist, int index,
> FileSelType select, unsigned int flag, FileCheckType check)
>  {
> -       struct direntry *file;
> -       int num, act= 0;
> -
> -       file= filelist->filelist;
> -       for(num=0; num<filelist->numfiles; num++, file++) {
> -               if(file->selflag & SELECTED_FILE) {
> -                       act= 1;
> -                       break;
> +       struct direntry* file = filelist_file(filelist, index);
> +       if (file != NULL) {
> +               int check_ok = 0;
> +               switch (check) {
> +                       case CHECK_DIRS:
> +                       case CHECK_ALL:
> +                               check_ok = 1;
> +                               break;
> +                       case CHECK_FILES:
> +                       default:
> +                               check_ok = !S_ISDIR(file->type);
> +                               break;
>                }
> -       }
> -       file= filelist->filelist+2;
> -       for(num=2; num<filelist->numfiles; num++, file++) {
> -               if(act) file->selflag &= ~SELECTED_FILE;
> -               else file->selflag |= SELECTED_FILE;
> -       }
> -}
> -
> -void filelist_select(struct FileList* filelist, FileSelection* sel,
> FileSelType select, unsigned int flag)
> -{
> -       /* select all valid files between first and last indicated */
> -       if ( (sel->first >= 0) && (sel->first < filelist->numfiltered) &&
> (sel->last >= 0) && (sel->last < filelist->numfiltered) ) {
> -               int current_file;
> -               for (current_file = sel->first; current_file <= sel->last;
> current_file++) {
> -                       struct direntry* file = filelist_file(filelist,
> current_file);
> -
> +               if (check_ok) {
>                        switch (select) {
>                                case FILE_SEL_REMOVE:
>                                        file->selflag &= ~flag;
> @@ -949,7 +937,34 @@
>        }
>  }
>
> +void filelist_select(struct FileList* filelist, FileSelection* sel,
> FileSelType select, unsigned int flag, FileCheckType check)
> +{
> +       /* select all valid files between first and last indicated */
> +       if ( (sel->first >= 0) && (sel->first < filelist->numfiltered) &&
> (sel->last >= 0) && (sel->last < filelist->numfiltered) ) {
> +               int current_file;
> +               for (current_file = sel->first; current_file <= sel->last;
> current_file++) {
> +                       filelist_select_file(filelist, current_file,
> select, flag, check);
> +               }
> +       }
> +}
>
> +int    filelist_is_selected(struct FileList* filelist, int index, unsigned
> int flag, FileCheckType check)
> +{
> +       struct direntry* file = filelist_file(filelist, index);
> +       if (!file) {
> +               return 0;
> +       }
> +       switch (check) {
> +               case CHECK_DIRS:
> +                       return S_ISDIR(file->type) && (file->selflag &
> SELECTED_FILE);
> +               case CHECK_FILES:
> +                       return S_ISREG(file->type) && (file->selflag &
> SELECTED_FILE);
> +               case CHECK_ALL:
> +               default:
> +                       return (file->selflag & SELECTED_FILE);
> +       }
> +}
> +
>  void filelist_sort(struct FileList* filelist, short sort)
>  {
>        switch(sort) {
>
> Modified: trunk/blender/source/blender/editors/space_file/filelist.h
> ===================================================================
> --- trunk/blender/source/blender/editors/space_file/filelist.h  2011-03-20
> 15:03:13 UTC (rev 35653)
> +++ trunk/blender/source/blender/editors/space_file/filelist.h  2011-03-20
> 15:15:05 UTC (rev 35654)
> @@ -58,6 +58,13 @@
>        FILE_SEL_TOGGLE  = 2
>  } FileSelType;
>
> +typedef enum FileCheckType
> +{
> +       CHECK_DIRS = 1,
> +       CHECK_FILES = 2,
> +       CHECK_ALL = 3
> +} FileCheckType;
> +
>  struct FileList *      filelist_new(short type);
>  void                           filelist_init_icons(void);
>  void                           filelist_free_icons(void);
> @@ -68,12 +75,13 @@
>  const char *           filelist_dir(struct FileList* filelist);
>  void                           filelist_setdir(struct FileList* filelist,
> const char *dir);
>  struct direntry *      filelist_file(struct FileList* filelist, int
> index);
> -void                           filelist_select(struct FileList* filelist,
> FileSelection* sel, FileSelType select, unsigned int flag);
> +void                           filelist_select(struct FileList* filelist,
> FileSelection* sel, FileSelType select, unsigned int flag, FileCheckType
> check);
> +void                           filelist_select_file(struct FileList*
> filelist, int index, FileSelType select, unsigned int flag, FileCheckType
> check);
> +int                                    filelist_is_selected(struct
> FileList* filelist, int index, unsigned int flag, FileCheckType check);
>  void                           filelist_hidedot(struct FileList* filelist,
> short hide);
>  void                           filelist_setfilter(struct FileList*
> filelist, unsigned int filter);
>  void                           filelist_setfilter_types(struct FileList*
> filelist, const char *filter_glob);
>
> @@ Diff output truncated at 10240 characters. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


More information about the Bf-committers mailing list