From 78bfaf1a4fe1a71408e4dab7268b1af1ed1b88f4 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 21 Sep 2022 10:57:36 +0200 Subject: File Browser: Manual auto-increase name support for output filepaths This functionality was present until Blender 2.80. Basically it adds back the "+" and "-" buttons in the file browser when it stores an output filepath. This is useful for someone rendering multiple versions of an animation (or a composition) to compare. At the moment this is used for the render output, and the File Output node in the compositor. Differential Revision: https://developer.blender.org/D15968 --- source/blender/editors/space_buttons/buttons_ops.c | 6 ++++++ source/blender/makesrna/RNA_types.h | 8 +++++++- source/blender/makesrna/intern/rna_nodetree.c | 1 + source/blender/makesrna/intern/rna_rna.c | 13 +++++++++++++ source/blender/makesrna/intern/rna_scene.c | 1 + .../blender/windowmanager/intern/wm_operator_props.c | 18 ++++++++---------- 6 files changed, 36 insertions(+), 11 deletions(-) (limited to 'source/blender') diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c index 10fb008049d..a9ce9a3d723 100644 --- a/source/blender/editors/space_buttons/buttons_ops.c +++ b/source/blender/editors/space_buttons/buttons_ops.c @@ -337,6 +337,12 @@ static int file_browse_invoke(bContext *C, wmOperator *op, const wmEvent *event) RNA_string_set(op->ptr, path_prop, str); MEM_freeN(str); + PropertyRNA *prop_check_existing = RNA_struct_find_property(op->ptr, "check_existing"); + if (!RNA_property_is_set(op->ptr, prop_check_existing)) { + const bool is_output_path = (RNA_property_flag(prop) & PROP_PATH_OUTPUT) != 0; + RNA_property_boolean_set(op->ptr, prop_check_existing, is_output_path); + } + WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index 353b2903fb1..b9556a411cf 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -179,7 +179,7 @@ typedef enum PropertySubType { /* Make sure enums are updated with these */ /* HIGHEST FLAG IN USE: 1 << 31 - * FREE FLAGS: 2, 9, 11, 13, 14, 15. */ + * FREE FLAGS: 9, 11, 13, 14, 15. */ typedef enum PropertyFlag { /** * Editable means the property is editable in the user @@ -299,6 +299,12 @@ typedef enum PropertyFlag { * properties which denotes whether modifier panel is collapsed or not. */ PROP_NO_DEG_UPDATE = (1 << 30), + + /** + * Filepaths that refer to output get a special treatment such + * as having the +/- operators available in the file browser. + **/ + PROP_PATH_OUTPUT = (1 << 2), } PropertyFlag; /** diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 971043158e1..892d523bdcf 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -7060,6 +7060,7 @@ static void def_cmp_output_file(BlenderRNA *brna, StructRNA *srna) prop = RNA_def_property(srna, "base_path", PROP_STRING, PROP_FILEPATH); RNA_def_property_string_sdna(prop, NULL, "base_path"); RNA_def_property_ui_text(prop, "Base Path", "Base output path for the image"); + RNA_def_property_flag(prop, PROP_PATH_OUTPUT); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "active_input_index", PROP_INT, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index 57f75fe892c..8d5e82cbfa8 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -160,6 +160,7 @@ const EnumPropertyItem rna_enum_property_flag_items[] = { 0, "Update on every keystroke in textedit 'mode'", ""}, + {PROP_PATH_OUTPUT, "OUTPUT_PATH", 0, "Output Path", ""}, {0, NULL, 0, NULL, NULL}, }; @@ -729,6 +730,12 @@ static bool rna_Property_is_library_editable_flag_get(PointerRNA *ptr) return (prop->flag & PROP_LIB_EXCEPTION) != 0; } +static bool rna_Property_is_path_output_flag_get(PointerRNA *ptr) +{ + PropertyRNA *prop = (PropertyRNA *)ptr->data; + return (prop->flag & PROP_PATH_OUTPUT) != 0; +} + static int rna_Property_tags_get(PointerRNA *ptr) { return RNA_property_tags(ptr->data); @@ -3023,6 +3030,12 @@ static void rna_def_property(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Library Editable", "Property is editable from linked instances (changes not saved)"); + prop = RNA_def_property(srna, "is_path_output", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_boolean_funcs(prop, "rna_Property_is_path_output_flag_get", NULL); + RNA_def_property_ui_text( + prop, "Path Output", "Property is a filename, filepath or directory output"); + prop = RNA_def_property(srna, "tags", PROP_ENUM, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_enum_items(prop, dummy_prop_tags); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 27cfe766eef..a1612159806 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -6553,6 +6553,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) "Output Path", "Directory/name to save animations, # characters defines the position " "and length of frame numbers"); + RNA_def_property_flag(prop, PROP_PATH_OUTPUT); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); /* Render result EXR cache. */ diff --git a/source/blender/windowmanager/intern/wm_operator_props.c b/source/blender/windowmanager/intern/wm_operator_props.c index 71c948dfbb9..bd3322a8023 100644 --- a/source/blender/windowmanager/intern/wm_operator_props.c +++ b/source/blender/windowmanager/intern/wm_operator_props.c @@ -120,16 +120,14 @@ void WM_operator_properties_filesel(wmOperatorType *ot, RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } - if (action == FILE_SAVE) { - /* NOTE: this is only used to check if we should highlight the filename area red when the - * filepath is an existing file. */ - prop = RNA_def_boolean(ot->srna, - "check_existing", - true, - "Check Existing", - "Check and warn on overwriting existing files"); - RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); - } + /* NOTE: this is only used to check if we should highlight the filename area red when the + * filepath is an existing file. */ + prop = RNA_def_boolean(ot->srna, + "check_existing", + action == FILE_SAVE, + "Check Existing", + "Check and warn on overwriting existing files"); + RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); prop = RNA_def_boolean( ot->srna, "filter_blender", (filter & FILE_TYPE_BLENDER) != 0, "Filter .blend files", ""); -- cgit v1.2.3