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:
-rw-r--r--source/blender/editors/space_file/file_ops.c25
-rw-r--r--source/blender/editors/space_file/filelist.c17
-rw-r--r--source/blender/editors/space_file/filelist.h7
3 files changed, 34 insertions, 15 deletions
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 21880a6b0c6..f36bb6f030d 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -162,7 +162,7 @@ static FileSelection file_selection_get(bContext* C, const rcti* rect, short fil
return sel;
}
-static FileSelect file_select_do(bContext* C, short select, int selected_idx)
+static FileSelect file_select_do(bContext* C, int selected_idx)
{
FileSelect retval = FILE_SELECT_NOTHING;
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -170,7 +170,7 @@ static FileSelect file_select_do(bContext* C, short select, int selected_idx)
int numfiles = filelist_numfiles(sfile->files);
/* make the selected file active */
- if (select && (selected_idx >= 0) && (selected_idx < numfiles)) {
+ if ( (selected_idx >= 0) && (selected_idx < numfiles)) {
struct direntry* file = filelist_file(sfile->files, selected_idx);
params->active_file = selected_idx;
@@ -205,11 +205,12 @@ static FileSelect file_select_do(bContext* C, short select, int selected_idx)
}
-static FileSelect file_select(bContext* C, const rcti* rect, short select, short fill)
+static FileSelect file_select(bContext* C, const rcti* rect, FileSelType select, short fill)
{
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, ACTIVEFILE);
@@ -217,8 +218,12 @@ static FileSelect file_select(bContext* C, const rcti* rect, short select, short
/* Don't act on multiple selected files */
if (sel.first != sel.last) select = 0;
- retval = file_select_do(C, select, sel.last);
-
+ /* Check last selection, if selected, act on the file or dir */
+ file = filelist_file(sfile->files, sel.last);
+ if (file->flags & ACTIVEFILE) {
+ retval = file_select_do(C, sel.last);
+ }
+
/* update operator for name change event */
file_draw_check_cb(C, NULL, NULL);
@@ -249,7 +254,7 @@ static int file_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
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, 1, HILITED_FILE);
+ filelist_select(sfile->files, &sel, FILE_SEL_ADD, HILITED_FILE);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
}
params->sel_first = sel.first; params->sel_last = sel.last;
@@ -278,7 +283,7 @@ static int file_border_select_exec(bContext *C, wmOperator *op)
BLI_isect_rcti(&(ar->v2d.mask), &rect, &rect);
- ret = file_select(C, &rect, select, 0);
+ ret = file_select(C, &rect, select ? FILE_SEL_ADD : FILE_SEL_REMOVE, 0);
if (FILE_SELECT_DIR == ret) {
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
} else if (FILE_SELECT_FILE == ret) {
@@ -308,6 +313,7 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
SpaceFile *sfile= CTX_wm_space_file(C);
+ FileSelect ret;
rcti rect;
int extend = RNA_boolean_get(op->ptr, "extend");
int fill = RNA_boolean_get(op->ptr, "fill");
@@ -324,9 +330,10 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* single select, deselect all selected first */
if (!extend) file_deselect_all(sfile, ACTIVEFILE);
- if (FILE_SELECT_DIR == file_select(C, &rect, 1, fill))
+ ret = file_select(C, &rect, extend ? FILE_SEL_TOGGLE : FILE_SEL_ADD, fill);
+ if (FILE_SELECT_DIR == ret)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
- else
+ else if (FILE_SELECT_FILE == ret)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
WM_event_add_mousemove(C); /* for directory changes */
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 5fb64b2f2bc..3c76b815a80 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -926,7 +926,7 @@ void filelist_swapselect(struct FileList* filelist)
}
}
-void filelist_select(struct FileList* filelist, FileSelection* sel, short select, unsigned int flag)
+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) ) {
@@ -934,10 +934,17 @@ void filelist_select(struct FileList* filelist, FileSelection* sel, short select
for (current_file = sel->first; current_file <= sel->last; current_file++) {
struct direntry* file = filelist_file(filelist, current_file);
- if (select)
- file->flags |= flag;
- else
- file->flags &= ~flag;
+ switch (select) {
+ case FILE_SEL_REMOVE:
+ file->flags &= ~flag;
+ break;
+ case FILE_SEL_ADD:
+ file->flags |= flag;
+ break;
+ case FILE_SEL_TOGGLE:
+ file->flags ^= flag;
+ break;
+ }
}
}
}
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index 399a8ff7943..3e3b52ed17c 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -52,6 +52,11 @@ struct rcti;
struct ReportList;
struct FileSelection;
+typedef enum FileSelType {
+ FILE_SEL_REMOVE = 0,
+ FILE_SEL_ADD = 1,
+ FILE_SEL_TOGGLE = 2
+} FileSelType;
struct FileList * filelist_new(short type);
void filelist_init_icons(void);
@@ -63,7 +68,7 @@ int filelist_numfiles(struct FileList* filelist);
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, short select, unsigned int flag);
+void filelist_select(struct FileList* filelist, FileSelection* sel, FileSelType select, unsigned int flag);
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);