diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-07-28 20:46:14 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-07-28 20:46:14 +0400 |
commit | aa44603146e87f29f08cee2abab7e0ddd89222c5 (patch) | |
tree | df7c7a0f0ecec9317c0350584a83644d9517c40c /source/blender/editors/space_file/file_panels.c | |
parent | 74e4ad20c9e8d19f85aaa2995652e3f65bdfc0c9 (diff) |
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.
Diffstat (limited to 'source/blender/editors/space_file/file_panels.c')
-rw-r--r-- | source/blender/editors/space_file/file_panels.c | 145 |
1 files changed, 100 insertions, 45 deletions
diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c index 351d1619508..f3c18859fb0 100644 --- a/source/blender/editors/space_file/file_panels.c +++ b/source/blender/editors/space_file/file_panels.c @@ -44,97 +44,150 @@ #include "UI_resources.h" #include "UI_view2d.h" +#include "WM_api.h" +#include "WM_types.h" + #include "file_intern.h" #include "fsmenu.h" #include <string.h> -static void do_file_panel_events(bContext *C, void *arg, int event) +static void file_panel_cb(bContext *C, void *arg_entry, void *arg_unused) { + PointerRNA ptr; + char *entry= (char*)arg_entry; + WM_operator_properties_create(&ptr, "FILE_OT_select_bookmark"); + RNA_string_set(&ptr, "dir", entry); + WM_operator_name_call(C, "FILE_OT_select_bookmark", WM_OP_INVOKE_REGION_WIN, &ptr); + WM_operator_properties_free(&ptr); } -static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory category, int icon, int allow_delete) +static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory category, short *nr, int icon, int allow_delete) { + SpaceFile *sfile= CTX_wm_space_file(C); uiBlock *block; + uiBut *but; + uiLayout *box, *col; struct FSMenu* fsmenu = fsmenu_get(); - int nentries = fsmenu_get_nentries(fsmenu, category); - int i; + char *curdir= (sfile->params)? sfile->params->dir: ""; + int i, nentries = fsmenu_get_nentries(fsmenu, category); + + /* reset each time */ + *nr= -1; + /* hide if no entries */ + if(nentries == 0) + return; + + /* layout */ uiLayoutSetAlignment(pa->layout, UI_LAYOUT_ALIGN_LEFT); - block= uiLayoutFreeBlock(pa->layout); - uiBlockSetHandleFunc(block, do_file_panel_events, NULL); - uiBlockSetEmboss(block, UI_EMBOSSP); - uiBlockBeginAlign(block); + block= uiLayoutGetBlock(pa->layout); + box= uiLayoutBox(pa->layout); + col= uiLayoutColumn(box, 1); + for (i=0; i< nentries;++i) { char dir[FILE_MAX]; char temp[FILE_MAX]; - uiLayout* layout = uiLayoutRow(pa->layout, UI_LAYOUT_ALIGN_LEFT); + uiLayout* layout = uiLayoutRow(col, 0); char *entry = fsmenu_get_entry(fsmenu, category, i); + /* set this list item as active if we have a match */ + if(strcmp(curdir, entry) == 0) + *nr= i; + /* create nice bookmark name, shows last directory in the full path currently */ BLI_strncpy(temp, entry, FILE_MAX); BLI_add_slash(temp); BLI_getlastdir(temp, dir, FILE_MAX); BLI_del_slash(dir); - /* operator shows the short bookmark name, should eventually have tooltip */ - uiItemStringO(layout, dir, icon, "FILE_OT_select_bookmark", "dir", entry); - if (allow_delete && fsmenu_can_save(fsmenu, category, i) ) + if(dir[0] == 0) + BLI_strncpy(dir, entry, FILE_MAX); + + /* create list item */ + but= uiDefIconTextButS(block, LISTROW, 0, icon, dir, 0,0,UI_UNIT_X*10,UI_UNIT_Y, nr, 0, i, 0, 0, entry); + uiButSetFunc(but, file_panel_cb, entry, NULL); + uiButSetFlag(but, UI_ICON_LEFT|UI_TEXT_LEFT); + + /* create delete button */ + if(allow_delete && fsmenu_can_save(fsmenu, category, i)) { + uiBlockSetEmboss(block, UI_EMBOSSN); uiItemIntO(layout, "", ICON_X, "FILE_OT_delete_bookmark", "index", i); + uiBlockSetEmboss(block, UI_EMBOSS); + } } - uiBlockEndAlign(block); } static void file_panel_system(const bContext *C, Panel *pa) { - file_panel_category(C, pa, FS_CATEGORY_SYSTEM, ICON_DISK_DRIVE, 0); + SpaceFile *sfile= CTX_wm_space_file(C); + + if(sfile) + file_panel_category(C, pa, FS_CATEGORY_SYSTEM, &sfile->systemnr, ICON_DISK_DRIVE, 0); } static void file_panel_bookmarks(const bContext *C, Panel *pa) { - file_panel_category(C, pa, FS_CATEGORY_BOOKMARKS, ICON_BOOKMARKS, 1); -} + SpaceFile *sfile= CTX_wm_space_file(C); + uiLayout *row; + if(sfile) { + row= uiLayoutRow(pa->layout, 0); + uiItemO(row, "Add", ICON_ZOOMIN, "file.add_bookmark"); + uiItemL(row, NULL, 0); + + file_panel_category(C, pa, FS_CATEGORY_BOOKMARKS, &sfile->bookmarknr, ICON_BOOKMARKS, 1); + } +} static void file_panel_recent(const bContext *C, Panel *pa) { - file_panel_category(C, pa, FS_CATEGORY_RECENT, ICON_FILE_FOLDER, 0); + SpaceFile *sfile= CTX_wm_space_file(C); + + if(sfile) + file_panel_category(C, pa, FS_CATEGORY_RECENT, &sfile->recentnr, ICON_FILE_FOLDER, 0); +} + + +static int file_panel_operator_poll(const bContext *C, PanelType *pt) +{ + SpaceFile *sfile= CTX_wm_space_file(C); + return (sfile && sfile->op); } +static void file_panel_operator_header(const bContext *C, Panel *pa) +{ + SpaceFile *sfile= CTX_wm_space_file(C); + wmOperator *op= sfile->op; + + BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname)); +} static void file_panel_operator(const bContext *C, Panel *pa) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); - struct wmOperator *op = sfile ? sfile->op : NULL; - uiBlock *block; - int sy; - - block= uiLayoutFreeBlock(pa->layout); - uiBlockSetHandleFunc(block, do_file_panel_events, NULL); - - sy= 0; - if (op) { - uiBlockBeginAlign(block); - RNA_STRUCT_BEGIN(op->ptr, prop) { - if(strcmp(RNA_property_identifier(prop), "rna_type") == 0) - continue; - if(strcmp(RNA_property_identifier(prop), "filename") == 0) - continue; - if(strcmp(RNA_property_identifier(prop), "display") == 0) - continue; - if(strncmp(RNA_property_identifier(prop), "filter", 6) == 0) - continue; - uiItemFullR(pa->layout, NULL, 0, op->ptr, prop, -1, 0, 0, 0, 0); - } - RNA_STRUCT_END; - uiBlockEndAlign(block); + SpaceFile *sfile= CTX_wm_space_file(C); + wmOperator *op= sfile->op; + int empty= 1; + + RNA_STRUCT_BEGIN(op->ptr, prop) { + if(strcmp(RNA_property_identifier(prop), "rna_type") == 0) + continue; + if(strcmp(RNA_property_identifier(prop), "filename") == 0) + continue; + if(strcmp(RNA_property_identifier(prop), "display") == 0) + continue; + if(strncmp(RNA_property_identifier(prop), "filter", 6) == 0) + continue; + + uiItemFullR(pa->layout, NULL, 0, op->ptr, prop, -1, 0, 0, 0, 0); + empty= 0; } - uiBlockLayoutResolve(C, block, NULL, &sy); - uiEndBlock(C, block); - uiDrawBlock(C, block); -} + RNA_STRUCT_END; + if(empty) + uiItemL(pa->layout, "No properties.", 0); +} void file_panels_register(ARegionType *art) { @@ -161,6 +214,8 @@ void file_panels_register(ARegionType *art) pt= MEM_callocN(sizeof(PanelType), "spacetype file operator properties"); strcpy(pt->idname, "FILE_PT_operator"); strcpy(pt->label, "Operator"); + pt->poll= file_panel_operator_poll; + pt->draw_header= file_panel_operator_header; pt->draw= file_panel_operator; BLI_addtail(&art->paneltypes, pt); } |