2.5 file browser
[blender.git] / source / blender / editors / space_file / file_draw.c
index f22290ce19bcb327108c89dbfb02d6ee5945b17e..f8705fe63a45c0f5ac4050dd0fa8d8eb4786e95c 100644 (file)
@@ -116,48 +116,113 @@ static void do_file_buttons(bContext *C, void *arg, int event)
        }
 }
 
        }
 }
 
-/* note; this function uses pixelspace (0, 0, winx, winy), not view2d */
+/* Note: This function uses pixelspace (0, 0, winx, winy), not view2d. 
+ * The controls are laid out as follows:
+ *
+ * -------------------------------------------
+ * | Directory input               | execute |
+ * -------------------------------------------
+ * | Filename input        | + | - | cancel  |
+ * -------------------------------------------
+ *
+ * The input widgets will stretch to fill any excess space.
+ * When there isn't enough space for all controls to be shown, they are
+ * hidden in this order: x/-, execute/cancel, input widgets.
+ */
 void file_draw_buttons(const bContext *C, ARegion *ar)
 {
 void file_draw_buttons(const bContext *C, ARegion *ar)
 {
-       SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+       /* Button layout. */
+       const short min_x      = 10;
+       const short max_x      = ar->winx - 10;
+       const short line2_y    = ar->winy - IMASEL_BUTTONS_HEIGHT - 12;
+       const short line1_y    = line2_y  + IMASEL_BUTTONS_HEIGHT/2 + 4;
+       const short input_minw = 20;
+       const short btn_h      = 21;
+       const short btn_fn_w   = 14;
+       const short btn_minw   = 80;
+       const short btn_margin = 20;
+       const short separator  = 4;
+
+       /* Additional locals. */
+       char  name[20];
+       short loadbutton;
+       short fnumbuttons;
+       short available_w = max_x - min_x;
+       short line1_w     = available_w;
+       short line2_w     = available_w;
+       
+       uiBut*            but;
+       uiBlock*          block;
+       SpaceFile*        sfile  = (SpaceFile*) CTX_wm_space_data(C);
        FileSelectParams* params = ED_fileselect_get_params(sfile);
        FileSelectParams* params = ED_fileselect_get_params(sfile);
-       uiBlock *block;
-       int loadbutton;
-       char name[20];
-       float slen;
-       int filebuty1, filebuty2;
-
-       float xmin = 8;
-       float xmax = ar->winx - 10;
-
-       filebuty1= ar->winy - IMASEL_BUTTONS_HEIGHT - 12;
-       filebuty2= filebuty1 + IMASEL_BUTTONS_HEIGHT/2 + 4;
-
-       /* HEADER */
+       
+       /* Initialize UI block. */
        sprintf(name, "win %p", ar);
        block = uiBeginBlock(C, ar, name, UI_EMBOSS);
        uiBlockSetHandleFunc(block, do_file_buttons, NULL);
        sprintf(name, "win %p", ar);
        block = uiBeginBlock(C, ar, name, UI_EMBOSS);
        uiBlockSetHandleFunc(block, do_file_buttons, NULL);
-
-       /* space available for load/save buttons? */
-       slen = UI_GetStringWidth(sfile->params->title);
-       loadbutton= slen > 60 ? slen + 20 : MAX2(80, 20+UI_GetStringWidth(params->title));
-       if(ar->winx > loadbutton+20) {
-               if(params->title[0]==0) {
-                       loadbutton= 0;
-               }
+       
+       /* Is there enough space for the execute / cancel buttons? */
+       loadbutton = UI_GetStringWidth(sfile->params->title) + btn_margin;
+       if (loadbutton < btn_minw) {
+               loadbutton = MAX2(btn_minw, 
+                                 btn_margin + UI_GetStringWidth(params->title));
        }
        }
-       else {
-               loadbutton= 0;
+       
+       if (available_w <= loadbutton + separator + input_minw 
+        || params->title[0] == 0) {
+               loadbutton = 0;
+       } else {
+               line1_w -= (loadbutton + separator);
+               line2_w  = line1_w;
        }
 
        }
 
-       uiDefBut(block, TEX, B_FS_FILENAME ,"", xmin+2, filebuty1, xmax-xmin-loadbutton-4, 21, params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
-       uiDefBut(block, TEX, B_FS_DIRNAME,"",   xmin+2, filebuty2, xmax-xmin-loadbutton-4, 21, params->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+       /* Is there enough space for file number increment/decrement buttons? */
+       fnumbuttons = 2 * btn_fn_w;
+       if (!loadbutton || line2_w <= fnumbuttons + separator + input_minw) {
+               fnumbuttons = 0;
+       } else {
+               line2_w -= (fnumbuttons + separator);
+       }
+       
+       /* Text input fields for directory and file. */
+       if (available_w > 0) {
+               uiDefBut(block, TEX, B_FS_DIRNAME, "",
+                        min_x, line1_y, line1_w, btn_h, 
+                        params->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, 
+                        "File path.");
+               uiDefBut(block, TEX, B_FS_FILENAME, "",
+                        min_x, line2_y, line2_w, btn_h,
+                        params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, 
+                        "File name.");
+       }
        
        
+       /* Filename number increment / decrement buttons. */
+       if (fnumbuttons) {
+               uiBlockBeginAlign(block);
+               but = uiDefButO(block, BUT, "FILE_OT_filenum", 0, "-",
+                       min_x + line2_w + separator, line2_y, 
+                       btn_fn_w, btn_h, 
+                       "Decrement the filename number.");    
+               RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", -1); 
+       
+               but = uiDefButO(block, BUT, "FILE_OT_filenum", 0, "+", 
+                       min_x + line2_w + separator + btn_fn_w, line2_y, 
+                       btn_fn_w, btn_h, 
+                       "Increment the filename number.");    
+               RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", 1); 
+               uiBlockEndAlign(block);
+       }
+       
+       /* Execute / cancel buttons. */
        if(loadbutton) {
        if(loadbutton) {
-               uiDefBut(block, BUT, B_FS_EXEC, params->title,  xmax-loadbutton, filebuty2, loadbutton, 21, params->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
-               uiDefBut(block, BUT, B_FS_CANCEL, "Cancel",             xmax-loadbutton, filebuty1, loadbutton, 21, params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+               uiDefBut(block, BUT, B_FS_EXEC, params->title, 
+                 max_x - loadbutton, line1_y, loadbutton, btn_h, 
+                 params->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, params->title);
+               uiDefBut(block, BUT, B_FS_CANCEL, "Cancel", 
+                 max_x - loadbutton, line2_y, loadbutton, btn_h, 
+                 params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "Cancel.");
        }
        }
-
+       
        uiEndBlock(C, block);
        uiDrawBlock(C, block);
 }
        uiEndBlock(C, block);
        uiDrawBlock(C, block);
 }