2.5 file browser

* buttons for increment/decrement number in filename
Patch provided by Johannes Meng, many thanks!
This commit is contained in:
Andrea Weikert
2009-07-10 17:26:19 +00:00
parent 66ca86b40b
commit b3d6b2f728

View 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)
{
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);
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);
/* 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;
}
}
else {
loadbutton= 0;
}
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, "");
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, "");
/* 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));
}
if (available_w <= loadbutton + separator + input_minw
|| params->title[0] == 0) {
loadbutton = 0;
} else {
line1_w -= (loadbutton + separator);
line2_w = line1_w;
}
/* 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) {
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);
}