[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21973] branches/blender2.5/blender/source /blender: 2.5: File browser
Brecht Van Lommel
brecht at blender.org
Tue Jul 28 18:46:14 CEST 2009
Revision: 21973
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21973
Author: blendix
Date: 2009-07-28 18:46:14 +0200 (Tue, 28 Jul 2009)
Log Message:
-----------
2.5: File browser
* Side panels now use list widgets.
* Enabled theme colors for side panel.
* Add button in bookmarks panel.
* Operator panel title now uses operator name.
* For unix, added / to system, and home and desktop to bookmarks.
* For opening fileselect with filter, cleaned up the code a bit,
adding WM_operator_properties_filesel instead of duplicating code.
* Also added filter for all operators calling fileselect, only image
and file open did it before.
* Hide . files by default, and also hide files ending with ~.
* Added back .. (but not .) in the file list, I really missed this.
* File highlight now only happens when you're actually over a file,
instead staying after you move the mouse away.
* Fix some redraw/refresh issues.
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/blenlib/intern/storage.c
branches/blender2.5/blender/source/blender/editors/curve/editfont.c
branches/blender2.5/blender/source/blender/editors/screen/screendump.c
branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c
branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
branches/blender2.5/blender/source/blender/editors/space_file/file_panels.c
branches/blender2.5/blender/source/blender/editors/space_file/filesel.c
branches/blender2.5/blender/source/blender/editors/space_file/fsmenu.c
branches/blender2.5/blender/source/blender/editors/space_file/space_file.c
branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c
branches/blender2.5/blender/source/blender/editors/space_info/info_ops.c
branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_add.c
branches/blender2.5/blender/source/blender/editors/space_text/text_ops.c
branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
branches/blender2.5/blender/source/blender/makesrna/intern/rna_space.c
branches/blender2.5/blender/source/blender/makesrna/intern/rna_ui.c
branches/blender2.5/blender/source/blender/makesrna/intern/rna_userdef.c
branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: branches/blender2.5/blender/source/blender/blenlib/intern/storage.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/storage.c 2009-07-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/storage.c 2009-07-28 16:46:14 UTC (rev 21973)
@@ -218,7 +218,7 @@
{
struct dirent *fname;
struct dirlink *dlink;
- int rellen, newnum = 0;
+ int rellen, newnum = 0, len;
char buf[256];
DIR *dir;
@@ -237,13 +237,11 @@
if ( (dir = (DIR *)opendir(".")) ){
while ((fname = (struct dirent*) readdir(dir)) != NULL) {
+ len= strlen(fname->d_name);
- if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0) {
- }
- else if ( ( (fname->d_name[0] == '.') && (fname->d_name[1] == 0) ) ||
- ( (fname->d_name[0] == '.') && (fname->d_name[1] == '.') && (fname->d_name[2] == 0)) ) {
- /* ignore '.' and '..' */
- }
+ if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0); /* ignore .file */
+ else if(hide_dot && len && fname->d_name[len-1]=='~'); /* ignore file~ */
+ else if (((fname->d_name[0] == '.') && (fname->d_name[1] == 0) )); /* ignore . */
else {
dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
if (dlink){
Modified: branches/blender2.5/blender/source/blender/editors/curve/editfont.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/curve/editfont.c 2009-07-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/editors/curve/editfont.c 2009-07-28 16:46:14 UTC (rev 21973)
@@ -416,7 +416,7 @@
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of text file to load.");
+ WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE);
}
/******************* paste buffer operator ********************/
Modified: branches/blender2.5/blender/source/blender/editors/screen/screendump.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screendump.c 2009-07-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/editors/screen/screendump.c 2009-07-28 16:46:14 UTC (rev 21973)
@@ -173,7 +173,7 @@
ot->flag= 0;
- RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
+ WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE);
RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
}
Modified: branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c 2009-07-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c 2009-07-28 16:46:14 UTC (rev 21973)
@@ -153,7 +153,7 @@
uiBut* but;
uiBlock* block;
- SpaceFile* sfile = (SpaceFile*) CTX_wm_space_data(C);
+ SpaceFile* sfile = CTX_wm_space_file(C);
FileSelectParams* params = ED_fileselect_get_params(sfile);
/* Initialize UI block. */
@@ -345,7 +345,7 @@
void file_calc_previews(const bContext *C, ARegion *ar)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
View2D *v2d= &ar->v2d;
ED_fileselect_init_layout(sfile, ar);
@@ -354,7 +354,7 @@
void file_draw_previews(const bContext *C, ARegion *ar)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
FileSelectParams* params= ED_fileselect_get_params(sfile);
FileLayout* layout= ED_fileselect_get_layout(sfile, ar);
View2D *v2d= &ar->v2d;
@@ -517,7 +517,7 @@
void file_draw_list(const bContext *C, ARegion *ar)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
FileSelectParams* params = ED_fileselect_get_params(sfile);
FileLayout* layout= ED_fileselect_get_layout(sfile, ar);
View2D *v2d= &ar->v2d;
Modified: branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c 2009-07-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c 2009-07-28 16:46:14 UTC (rev 21973)
@@ -143,14 +143,20 @@
params->active_file = last_file;
if(file && S_ISDIR(file->type)) {
- /* the path is too long! */
- if (strlen(params->dir) + strlen(file->relname) >= FILE_MAX )
+ /* the path is too long and we are not going up! */
+ if (strcmp(file->relname, "..") && strlen(params->dir) + strlen(file->relname) >= FILE_MAX )
{
// XXX error("Path too long, cannot enter this directory");
} else {
- BLI_cleanup_dir(G.sce, params->dir);
- strcat(params->dir, file->relname);
- BLI_add_slash(params->dir);
+ if (strcmp(file->relname, "..")==0) {
+ /* avoids /../../ */
+ BLI_parent_dir(params->dir);
+ } else {
+ BLI_cleanup_dir(G.sce, params->dir);
+ strcat(params->dir, file->relname);
+ BLI_add_slash(params->dir);
+ }
+
params->file[0] = '\0';
file_change_dir(sfile);
retval = FILE_SELECT_DIR;
@@ -172,7 +178,7 @@
static int file_border_select_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
short val;
rcti rect;
@@ -216,24 +222,31 @@
static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
short val;
rcti rect;
+ if(ar->regiontype != RGN_TYPE_WINDOW)
+ return OPERATOR_CANCELLED;
+
rect.xmin = rect.xmax = event->x - ar->winrct.xmin;
rect.ymin = rect.ymax = event->y - ar->winrct.ymin;
val = event->val;
- if (BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin)) {
+ if(!BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin))
+ return OPERATOR_CANCELLED;
- /* single select, deselect all selected first */
- file_deselect_all(sfile);
- if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, val )) {
- WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
- } else {
- WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL);
- }
- }
+ /* single select, deselect all selected first */
+ file_deselect_all(sfile);
+
+ if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, val ))
+ WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
+ else
+ WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL);
+
+ WM_event_add_mousemove(C); /* for directory changes */
+ WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL);
+
return OPERATOR_FINISHED;
}
@@ -254,7 +267,7 @@
static int file_select_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ScrArea *sa= CTX_wm_area(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
int numfiles = filelist_numfiles(sfile->files);
int i;
int select = 1;
@@ -299,7 +312,7 @@
static int bookmark_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
if(RNA_struct_find_property(op->ptr, "dir")) {
char entry[256];
@@ -333,7 +346,7 @@
static int bookmark_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ScrArea *sa= CTX_wm_area(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
struct FSMenu* fsmenu = fsmenu_get();
struct FileSelectParams* params= ED_fileselect_get_params(sfile);
@@ -398,7 +411,7 @@
static int loadimages_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ScrArea *sa= CTX_wm_area(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
if (sfile->files) {
filelist_loadimage_timer(sfile->files);
if (filelist_changed(sfile->files)) {
@@ -425,32 +438,42 @@
int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
{
FileSelectParams* params;
- int numfiles, actfile;
+ int numfiles, actfile, origfile;
if(sfile==NULL || sfile->files==NULL) return 0;
-
+
numfiles = filelist_numfiles(sfile->files);
params = ED_fileselect_get_params(sfile);
- actfile = find_file_mouse(sfile, ar, mx , my, 0);
-
- if (params && (actfile >= 0) && (actfile < numfiles) ) {
- params->active_file=actfile;
- return 1;
- }
- params->active_file= -1;
- return 0;
+ origfile= params->active_file;
+
+ mx -= ar->winrct.xmin;
+ my -= ar->winrct.ymin;
+
+ if(BLI_in_rcti(&ar->v2d.mask, mx, my)) {
+ actfile = find_file_mouse(sfile, ar, mx , my, 0);
+
+ if((actfile >= 0) && (actfile < numfiles))
+ params->active_file=actfile;
+ else
+ params->active_file= -1;
+ }
+ else
+ params->active_file= -1;
+
+ return (params->active_file != origfile);
}
static int file_highlight_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(!file_hilight_set(sfile, ar, event->x, event->y))
+ return OPERATOR_CANCELLED;
+
+ ED_area_tag_redraw(CTX_wm_area(C));
- if( file_hilight_set(sfile, ar, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin)) {
- ED_area_tag_redraw(CTX_wm_area(C));
- }
-
return OPERATOR_FINISHED;
}
@@ -467,7 +490,7 @@
int file_cancel_exec(bContext *C, wmOperator *unused)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
folderlist_free(sfile->folders_prev);
folderlist_free(sfile->folders_next);
@@ -492,7 +515,7 @@
/* sends events now, so things get handled on windowqueue level */
int file_exec(bContext *C, wmOperator *unused)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
char name[FILE_MAX];
if(sfile->op) {
@@ -559,7 +582,7 @@
int file_parent_exec(bContext *C, wmOperator *unused)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
if(sfile->params) {
if (BLI_has_parent(sfile->params->dir)) {
@@ -589,7 +612,7 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list