/* ---------- FILE SELECTION ------------ */
-static int find_file_mouse_hor(SpaceFile *sfile, struct ARegion* ar, short x, short y)
+static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, short x, short y)
{
float fx,fy;
- int offsetx, offsety;
- int columns;
int active_file = -1;
int numfiles = filelist_numfiles(sfile->files);
View2D* v2d = &ar->v2d;
UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
- offsetx = (fx - (v2d->cur.xmin+sfile->tile_border_x))/(sfile->tile_w + 2*sfile->tile_border_x);
- offsety = (v2d->tot.ymax - sfile->tile_border_y - fy)/(sfile->tile_h + 2*sfile->tile_border_y);
- columns = (v2d->cur.xmax - v2d->cur.xmin) / (sfile->tile_w+ 2*sfile->tile_border_x);
- active_file = offsetx + columns*offsety;
+ active_file = ED_fileselect_layout_offset(sfile->layout, v2d->tot.xmin + fx, v2d->tot.ymax - fy);
if ( (active_file < 0) || (active_file >= numfiles) )
{
}
-static int find_file_mouse_vert(SpaceFile *sfile, struct ARegion* ar, short x, short y)
-{
- int offsetx, offsety;
- float fx,fy;
- int active_file = -1;
- int numfiles = filelist_numfiles(sfile->files);
- int rows;
- View2D* v2d = &ar->v2d;
-
- UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
-
- offsetx = (fx-sfile->tile_border_x)/(sfile->tile_w + sfile->tile_border_x);
- offsety = (v2d->cur.ymax-fy-sfile->tile_border_y)/(sfile->tile_h + sfile->tile_border_y);
- rows = (v2d->cur.ymax - v2d->cur.ymin - 2*sfile->tile_border_y) / (sfile->tile_h+sfile->tile_border_y);
- active_file = rows*offsetx + offsety;
- if ( (active_file < 0) || (active_file >= numfiles) )
- {
- active_file = -1;
- }
- return active_file;
-}
-
static void file_deselect_all(SpaceFile* sfile)
{
int numfiles = filelist_numfiles(sfile->files);
}
}
-static void file_select(SpaceFile* sfile, FileSelectParams* params, ARegion* ar, const rcti* rect, short val)
+static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short val)
{
int first_file = -1;
int last_file = -1;
int act_file;
short selecting = (val == LEFTMOUSE);
+ FileSelectParams *params = ED_fileselect_get_params(sfile);
+ FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
int numfiles = filelist_numfiles(sfile->files);
params->selstate = NOTACTIVE;
- if (params->display) {
- first_file = find_file_mouse_hor(sfile, ar, rect->xmin, rect->ymax);
- last_file = find_file_mouse_hor(sfile, ar, rect->xmax, rect->ymin);
- } else {
- first_file = find_file_mouse_vert(sfile, ar, rect->xmin, rect->ymax);
- last_file = find_file_mouse_vert(sfile, ar, rect->xmax, rect->ymin);
- }
+ first_file = find_file_mouse(sfile, ar, rect->xmin, rect->ymax);
+ last_file = find_file_mouse(sfile, ar, rect->xmax, rect->ymin);
/* select all valid files between first and last indicated */
if ( (first_file >= 0) && (first_file < numfiles) && (last_file >= 0) && (last_file < numfiles) ) {
file->flags &= ~ACTIVE;
}
}
-
+
/* make the last file active */
if (last_file >= 0 && last_file < numfiles) {
struct direntry* file = filelist_file(sfile->files, last_file);
rect.xmax= RNA_int_get(op->ptr, "xmax");
rect.ymax= RNA_int_get(op->ptr, "ymax");
- file_select(sfile, sfile->params, ar, &rect, val );
+ file_select(sfile, ar, &rect, val );
WM_event_add_notifier(C, NC_WINDOW, NULL);
return OPERATOR_FINISHED;
}
-void ED_FILE_OT_border_select(wmOperatorType *ot)
+void FILE_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Activate/Select File";
- ot->idname= "ED_FILE_OT_border_select";
+ ot->idname= "FILE_OT_select_border";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
rect.ymin = rect.ymax = event->y - ar->winrct.ymin;
val = event->val;
- /* single select, deselect all selected first */
- file_deselect_all(sfile);
- file_select(sfile, sfile->params, ar, &rect, val );
- WM_event_add_notifier(C, NC_WINDOW, NULL);
+ if (BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin)) {
+
+ /* single select, deselect all selected first */
+ file_deselect_all(sfile);
+ file_select(sfile, ar, &rect, val );
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+ }
return OPERATOR_FINISHED;
}
-void ED_FILE_OT_select(wmOperatorType *ot)
+void FILE_OT_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Activate/Select File";
- ot->idname= "ED_FILE_OT_select";
+ ot->idname= "FILE_OT_select";
/* api callbacks */
ot->invoke= file_select_invoke;
return OPERATOR_FINISHED;
}
-void ED_FILE_OT_select_all(wmOperatorType *ot)
+void FILE_OT_select_all_toggle(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select/Deselect all files";
- ot->idname= "ED_FILE_OT_select_all";
+ ot->idname= "FILE_OT_select_all_toggle";
/* api callbacks */
ot->invoke= file_select_all_invoke;
/* ---------- BOOKMARKS ----------- */
-static void set_active_bookmark(FileSelectParams* params, struct ARegion* ar, short x, short y)
+static int file_select_bookmark_category(SpaceFile* sfile, ARegion* ar, short x, short y, FSMenuCategory category)
{
- int nentries = fsmenu_get_nentries();
- float fx, fy;
- short posy;
-
- UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy);
-
- posy = ar->v2d.cur.ymax - 2*TILE_BORDER_Y - fy;
- params->active_bookmark = ((float)posy / (U.fontsize*3.0f/2.0f));
- if (params->active_bookmark < 0 || params->active_bookmark > nentries) {
- params->active_bookmark = -1;
+ struct FSMenu* fsmenu = fsmenu_get();
+ int nentries = fsmenu_get_nentries(fsmenu, category);
+ int linestep = file_font_pointsize()*2.0f;
+ short xs, ys;
+ int i;
+ int selected = -1;
+
+ for (i=0; i < nentries; ++i) {
+ fsmenu_get_pos(fsmenu, category, i, &xs, &ys);
+ if ( (y<=ys) && (y>ys-linestep) ) {
+ fsmenu_select_entry(fsmenu, category, i);
+ selected = i;
+ break;
+ }
}
+ return selected;
}
static void file_select_bookmark(SpaceFile* sfile, ARegion* ar, short x, short y)
{
+ float fx, fy;
+ int selected;
+ FSMenuCategory category = FS_CATEGORY_SYSTEM;
+
if (BLI_in_rcti(&ar->v2d.mask, x, y)) {
- char *selected;
- set_active_bookmark(sfile->params, ar, x, y);
- selected= fsmenu_get_entry(sfile->params->active_bookmark);
- /* which string */
- if (selected) {
- FileSelectParams* params = sfile->params;
- BLI_strncpy(params->dir, selected, sizeof(params->dir));
- BLI_cleanup_dir(G.sce, params->dir);
- filelist_free(sfile->files);
- filelist_setdir(sfile->files, params->dir);
- params->file[0] = '\0';
- params->active_file = -1;
+ char *entry;
+
+ UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy);
+ selected = file_select_bookmark_category(sfile, ar, fx, fy, FS_CATEGORY_SYSTEM);
+ if (selected<0) {
+ category = FS_CATEGORY_BOOKMARKS;
+ selected = file_select_bookmark_category(sfile, ar, fx, fy, category);
+ }
+ if (selected<0) {
+ category = FS_CATEGORY_RECENT;
+ selected = file_select_bookmark_category(sfile, ar, fx, fy, category);
+ }
+
+ if (selected>=0) {
+ entry= fsmenu_get_entry(fsmenu_get(), category, selected);
+ /* which string */
+ if (entry) {
+ FileSelectParams* params = sfile->params;
+ BLI_strncpy(params->dir, entry, sizeof(params->dir));
+ BLI_cleanup_dir(G.sce, params->dir);
+ filelist_free(sfile->files);
+ filelist_setdir(sfile->files, params->dir);
+ params->file[0] = '\0';
+ params->active_file = -1;
+ }
}
}
}
return OPERATOR_FINISHED;
}
-void ED_FILE_OT_select_bookmark(wmOperatorType *ot)
+void FILE_OT_select_bookmark(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Directory";
- ot->idname= "ED_FILE_OT_select_bookmark";
+ ot->idname= "FILE_OT_select_bookmark";
/* api callbacks */
ot->invoke= bookmark_select_invoke;
return OPERATOR_FINISHED;
}
-void ED_FILE_OT_loadimages(wmOperatorType *ot)
+void FILE_OT_loadimages(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Load Images";
- ot->idname= "ED_FILE_OT_loadimages";
+ ot->idname= "FILE_OT_loadimages";
/* api callbacks */
ot->invoke= loadimages_invoke;
numfiles = filelist_numfiles(sfile->files);
params = ED_fileselect_get_params(sfile);
+
+ actfile = find_file_mouse(sfile, ar, mx , my);
- if (params->display) {
- actfile = find_file_mouse_hor(sfile, ar, mx , my);
- } else {
- actfile = find_file_mouse_vert(sfile, ar, mx, my);
- }
-
- if (actfile >= 0 && actfile < numfiles ) {
+ if (params && (actfile >= 0) && (actfile < numfiles) ) {
params->active_file=actfile;
return 1;
- }
+ }
+ params->active_file= -1;
return 0;
}
return OPERATOR_FINISHED;
}
-void ED_FILE_OT_highlight(struct wmOperatorType *ot)
+void FILE_OT_highlight(struct wmOperatorType *ot)
{
/* identifiers */
ot->name= "Highlight File";
- ot->idname= "ED_FILE_OT_highlight";
+ ot->idname= "FILE_OT_highlight";
/* api callbacks */
ot->invoke= file_highlight_invoke;
{
SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
- if(sfile->op) {
- WM_operator_free(sfile->op);
- sfile->op = NULL;
- }
- ED_screen_full_prevspace(C);
+ WM_event_fileselect_event(C, sfile->op, EVT_FILESELECT_CANCEL);
+ sfile->op = NULL;
return OPERATOR_FINISHED;
}
-void ED_FILE_OT_cancel(struct wmOperatorType *ot)
+void FILE_OT_cancel(struct wmOperatorType *ot)
{
/* identifiers */
ot->name= "Cancel File Load";
- ot->idname= "ED_FILE_OT_cancel";
+ ot->idname= "FILE_OT_cancel";
/* api callbacks */
ot->exec= file_cancel_exec;
ot->poll= ED_operator_file_active;
}
-
-int file_load_exec(bContext *C, wmOperator *unused)
+/* 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);
char name[FILE_MAX];
- ED_screen_full_prevspace(C);
-
if(sfile->op) {
wmOperator *op= sfile->op;
- /* if load .blend, all UI pointers after exec are invalid! */
- /* but, operator can be freed still */
-
sfile->op = NULL;
BLI_strncpy(name, sfile->params->dir, sizeof(name));
strcat(name, sfile->params->file);
RNA_string_set(op->ptr, "filename", name);
- /* this gives ownership to pupmenu */
- uiPupMenuSaveOver(C, op, name);
+ fsmenu_insert_entry(fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir,0, 1);
+ BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs");
+ fsmenu_write_file(fsmenu_get(), name);
+ WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC);
}
-
+
return OPERATOR_FINISHED;
}
-void ED_FILE_OT_load(struct wmOperatorType *ot)
+void FILE_OT_exec(struct wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Load File";
- ot->idname= "ED_FILE_OT_load";
+ ot->name= "Execute File Window";
+ ot->idname= "FILE_OT_exec";
/* api callbacks */
- ot->exec= file_load_exec;
+ ot->exec= file_exec;
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
}
+
int file_parent_exec(bContext *C, wmOperator *unused)
{
SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
}
-void ED_FILE_OT_parent(struct wmOperatorType *ot)
+
+void FILE_OT_parent(struct wmOperatorType *ot)
{
/* identifiers */
ot->name= "Parent File";
- ot->idname= "ED_FILE_OT_parent";
+ ot->idname= "FILE_OT_parent";
/* api callbacks */
ot->exec= file_parent_exec;
}
+int file_refresh_exec(bContext *C, wmOperator *unused)
+{
+ SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+
+ if(sfile->params) {
+ filelist_setdir(sfile->files, sfile->params->dir);
+ filelist_free(sfile->files);
+ sfile->params->active_file = -1;
+ }
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+
+}
+
+void FILE_OT_refresh(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Refresh Filelist";
+ ot->idname= "FILE_OT_refresh";
+
+ /* api callbacks */
+ ot->exec= file_refresh_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
+
+struct ARegion *file_buttons_region(struct ScrArea *sa)
+{
+ ARegion *ar;
+
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ if(ar->regiontype==RGN_TYPE_CHANNELS)
+ return ar;
+ return NULL;
+}
+
+int file_bookmark_toggle_exec(bContext *C, wmOperator *unused)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ ARegion *ar= file_buttons_region(sa);
+
+ if(ar) {
+ ar->flag ^= RGN_FLAG_HIDDEN;
+ ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
+
+ ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
+ ED_area_tag_redraw(sa);
+ }
+ return OPERATOR_FINISHED;
+}
+
+void FILE_OT_bookmark_toggle(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Bookmarks";
+ ot->idname= "FILE_OT_bookmark_toggle";
+
+ /* api callbacks */
+ ot->exec= file_bookmark_toggle_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}