diff options
Diffstat (limited to 'source/blender/editors/space_file/file_panels.c')
-rw-r--r-- | source/blender/editors/space_file/file_panels.c | 116 |
1 files changed, 115 insertions, 1 deletions
diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c index d9a6e70121f..9ba098fcf45 100644 --- a/source/blender/editors/space_file/file_panels.c +++ b/source/blender/editors/space_file/file_panels.c @@ -95,7 +95,7 @@ static void file_panel_operator(const bContext *C, Panel *pa) UI_block_func_set(uiLayoutGetBlock(pa->layout), NULL, NULL, NULL); } -void file_panels_register(ARegionType *art) +void file_tool_props_region_panels_register(ARegionType *art) { PanelType *pt; @@ -103,8 +103,122 @@ void file_panels_register(ARegionType *art) strcpy(pt->idname, "FILE_PT_operator"); strcpy(pt->label, N_("Operator")); strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); + pt->flag = PNL_NO_HEADER; pt->poll = file_panel_operator_poll; pt->draw_header = file_panel_operator_header; pt->draw = file_panel_operator; BLI_addtail(&art->paneltypes, pt); } + +static void file_panel_execution_cancel_button(uiLayout *layout) +{ + uiLayout *row = uiLayoutRow(layout, false); + uiLayoutSetScaleX(row, 0.8f); + uiLayoutSetFixedSize(row, true); + uiItemO(row, IFACE_("Cancel"), ICON_NONE, "FILE_OT_cancel"); +} + +static void file_panel_execution_execute_button(uiLayout *layout, const char *title) +{ + uiLayout *row = uiLayoutRow(layout, false); + uiLayoutSetScaleX(row, 0.8f); + uiLayoutSetFixedSize(row, true); + /* Just a display hint. */ + uiLayoutSetActiveDefault(row, true); + uiItemO(row, title, ICON_NONE, "FILE_OT_execute"); +} + +static void file_panel_execution_buttons_draw(const bContext *C, Panel *pa) +{ + bScreen *screen = CTX_wm_screen(C); + SpaceFile *sfile = CTX_wm_space_file(C); + FileSelectParams *params = ED_fileselect_get_params(sfile); + uiBlock *block = uiLayoutGetBlock(pa->layout); + uiBut *but; + uiLayout *row; + PointerRNA params_rna_ptr, *but_extra_rna_ptr; + + const bool overwrite_alert = file_draw_check_exists(sfile); + const bool windows_layout = +#ifdef _WIN32 + true; +#else + false; +#endif + + RNA_pointer_create(&screen->id, &RNA_FileSelectParams, params, ¶ms_rna_ptr); + + row = uiLayoutRow(pa->layout, false); + uiLayoutSetScaleY(row, 1.3f); + + /* callbacks for operator check functions */ + UI_block_func_set(block, file_draw_check_cb, NULL, NULL); + + but = uiDefButR(block, + UI_BTYPE_TEXT, + -1, + "", + 0, + 0, + UI_UNIT_X * 5, + UI_UNIT_Y, + ¶ms_rna_ptr, + "filename", + 0, + 0.0f, + (float)FILE_MAXFILE, + 0, + 0, + TIP_(overwrite_alert ? N_("File name, overwrite existing") : N_("File name"))); + + BLI_assert(!UI_but_flag_is_set(but, UI_BUT_UNDO)); + BLI_assert(!UI_but_is_utf8(but)); + + UI_but_func_complete_set(but, autocomplete_file, NULL); + /* silly workaround calling NFunc to ensure this does not get called + * immediate ui_apply_but_func but only after button deactivates */ + UI_but_funcN_set(but, file_filename_enter_handle, NULL, but); + + if (params->flag & FILE_CHECK_EXISTING) { + but_extra_rna_ptr = UI_but_extra_operator_icon_add( + but, "FILE_OT_filenum", WM_OP_EXEC_REGION_WIN, ICON_ADD); + RNA_int_set(but_extra_rna_ptr, "increment", 1); + but_extra_rna_ptr = UI_but_extra_operator_icon_add( + but, "FILE_OT_filenum", WM_OP_EXEC_REGION_WIN, ICON_REMOVE); + RNA_int_set(but_extra_rna_ptr, "increment", -1); + } + + /* check if this overrides a file and if the operator option is used */ + if (overwrite_alert) { + UI_but_flag_enable(but, UI_BUT_REDALERT); + } + UI_block_func_set(block, NULL, NULL, NULL); + + { + uiLayout *sub = uiLayoutRow(row, false); + uiLayoutSetOperatorContext(sub, WM_OP_EXEC_REGION_WIN); + + if (windows_layout) { + file_panel_execution_execute_button(sub, params->title); + file_panel_execution_cancel_button(sub); + } + else { + file_panel_execution_cancel_button(sub); + file_panel_execution_execute_button(sub, params->title); + } + } +} + +void file_execute_region_panels_register(ARegionType *art) +{ + PanelType *pt; + + pt = MEM_callocN(sizeof(PanelType), "spacetype file execution buttons"); + strcpy(pt->idname, "FILE_PT_execution_buttons"); + strcpy(pt->label, N_("Execute Buttons")); + strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); + pt->flag = PNL_NO_HEADER; + pt->poll = file_panel_operator_poll; + pt->draw = file_panel_execution_buttons_draw; + BLI_addtail(&art->paneltypes, pt); +} |