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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-07-28 20:46:14 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-07-28 20:46:14 +0400
commitaa44603146e87f29f08cee2abab7e0ddd89222c5 (patch)
treedf7c7a0f0ecec9317c0350584a83644d9517c40c /source/blender/editors/space_file/file_panels.c
parent74e4ad20c9e8d19f85aaa2995652e3f65bdfc0c9 (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.c145
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);
}