2.5: File browser
[blender.git] / source / blender / editors / space_file / file_panels.c
index 351d1619508beff51204a7217eac9a4b4cd7e743..f3c18859fb02ecfcbef7f7498427dad335c71a9f 100644 (file)
 #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);
 }