Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release/scripts')
m---------release/scripts/addons0
m---------release/scripts/addons_contrib0
-rw-r--r--release/scripts/modules/bl_i18n_utils/utils.py2
-rw-r--r--release/scripts/modules/bpy_extras/asset_utils.py11
-rw-r--r--release/scripts/modules/rna_manual_reference.py82
-rw-r--r--release/scripts/modules/rna_prop_ui.py5
-rw-r--r--release/scripts/presets/keyconfig/Blender.py103
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/blender_default.py315
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py3
-rw-r--r--release/scripts/startup/bl_app_templates_system/2D_Animation/__init__.py15
-rw-r--r--release/scripts/startup/bl_operators/assets.py42
-rw-r--r--release/scripts/startup/bl_operators/wm.py699
-rw-r--r--release/scripts/startup/bl_ui/properties_data_mesh.py1
-rw-r--r--release/scripts/startup/bl_ui/space_filebrowser.py43
-rw-r--r--release/scripts/startup/bl_ui/space_image.py44
-rw-r--r--release/scripts/startup/bl_ui/space_node.py5
-rw-r--r--release/scripts/startup/bl_ui/space_outliner.py3
-rw-r--r--release/scripts/startup/bl_ui/space_sequencer.py186
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_common.py11
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_toolbar.py5
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py23
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py14
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py34
-rw-r--r--release/scripts/startup/nodeitems_builtins.py137
24 files changed, 1143 insertions, 640 deletions
diff --git a/release/scripts/addons b/release/scripts/addons
-Subproject a85360cbdfbbee2bb46bcb93900f597a989bd33
+Subproject c64726810ba781d980921947ba819b1364689e5
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
-Subproject 42da56aa73726710107031787af5eea18679798
+Subproject 5a82baad9f986722104280e8354a4427d8e9eab
diff --git a/release/scripts/modules/bl_i18n_utils/utils.py b/release/scripts/modules/bl_i18n_utils/utils.py
index 95184853f73..13fb87d386a 100644
--- a/release/scripts/modules/bl_i18n_utils/utils.py
+++ b/release/scripts/modules/bl_i18n_utils/utils.py
@@ -219,7 +219,7 @@ def enable_addons(addons=None, support=None, disable=False, check_only=False):
try:
import bpy
except ModuleNotFoundError:
- print("Could not import bpy, enable_addons must be run from whithin Blender.")
+ print("Could not import bpy, enable_addons must be run from within Blender.")
return
if addons is None:
diff --git a/release/scripts/modules/bpy_extras/asset_utils.py b/release/scripts/modules/bpy_extras/asset_utils.py
index 2cd5dddefbc..c7ebdc1d5e1 100644
--- a/release/scripts/modules/bpy_extras/asset_utils.py
+++ b/release/scripts/modules/bpy_extras/asset_utils.py
@@ -52,19 +52,12 @@ class AssetBrowserPanel:
bl_space_type = 'FILE_BROWSER'
@classmethod
- def poll(cls, context):
+ def asset_browser_panel_poll(cls, context):
return SpaceAssetInfo.is_asset_browser_poll(context)
-
-class AssetBrowserSpecificCategoryPanel(AssetBrowserPanel):
- asset_categories = set() # Set of strings like 'ANIMATIONS', see `asset_category_items` in rna_space.c
-
@classmethod
def poll(cls, context):
- return (
- SpaceAssetInfo.is_asset_browser_poll(context)
- and context.space_data.params.asset_category in cls.asset_categories
- )
+ return cls.asset_browser_panel_poll(context)
class AssetMetaDataPanel:
diff --git a/release/scripts/modules/rna_manual_reference.py b/release/scripts/modules/rna_manual_reference.py
index 40f59307bec..797eb2627b3 100644
--- a/release/scripts/modules/rna_manual_reference.py
+++ b/release/scripts/modules/rna_manual_reference.py
@@ -39,8 +39,8 @@ if LANG is not None:
url_manual_prefix = url_manual_prefix.replace("manual/en", "manual/" + LANG)
url_manual_mapping = (
- ("bpy.types.cyclesworldsettings.sample_mbpy.types.cyclesworldsettings.sample_map_resolutionbpy.types.cyclesworldsettings.sample_map_resolutionap_resolution*", "render/cycles/world_settings.html#bpy-types-cyclesworldsettings-sample-mbpy-types-cyclesworldsettings-sample-map-resolutionbpy-types-cyclesworldsettings-sample-map-resolutionap-resolution"),
("bpy.types.movietrackingsettings.refine_intrinsics_tangential_distortion*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-refine-intrinsics-tangential-distortion"),
+ ("bpy.types.spacesequesequencertimelineoverlaynceeditor.show_strip_offset*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequesequencertimelineoverlaynceeditor-show-strip-offset"),
("bpy.types.movietrackingsettings.refine_intrinsics_radial_distortion*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-refine-intrinsics-radial-distortion"),
("bpy.types.fluiddomainsettings.sndparticle_potential_max_trappedair*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-potential-max-trappedair"),
("bpy.types.fluiddomainsettings.sndparticle_potential_min_trappedair*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-potential-min-trappedair"),
@@ -60,11 +60,13 @@ url_manual_mapping = (
("bpy.types.fluiddomainsettings.sndparticle_sampling_wavecrest*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-sampling-wavecrest"),
("bpy.types.rigidbodyconstraint.use_override_solver_iterations*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-use-override-solver-iterations"),
("bpy.types.toolsettings.use_transform_correct_face_attributes*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-transform-correct-face-attributes"),
+ ("bpy.types.cyclesrendersettings.preview_adaptive_min_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-adaptive-min-samples"),
("bpy.types.rendersettings.use_sequencer_override_scene_strip*", "video_editing/preview/sidebar.html#bpy-types-rendersettings-use-sequencer-override-scene-strip"),
("bpy.types.toolsettings.use_transform_correct_keep_connected*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-transform-correct-keep-connected"),
+ ("bpy.types.cyclesrendersettings.preview_denoising_prefilter*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-denoising-prefilter"),
("bpy.types.fluiddomainsettings.sndparticle_potential_radius*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-potential-radius"),
("bpy.types.cyclesrendersettings.film_transparent_roughness*", "render/cycles/render_settings/film.html#bpy-types-cyclesrendersettings-film-transparent-roughness"),
- ("bpy.types.cyclesrendersettings.sample_all_lights_indirect*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-sample-all-lights-indirect"),
+ ("bpy.types.cyclesrendersettings.preview_adaptive_threshold*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-adaptive-threshold"),
("bpy.types.fluiddomainsettings.openvdb_cache_compress_type*", "physics/fluid/type/domain/cache.html#bpy-types-fluiddomainsettings-openvdb-cache-compress-type"),
("bpy.types.fluiddomainsettings.sndparticle_bubble_buoyancy*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-bubble-buoyancy"),
("bpy.types.fluiddomainsettings.sndparticle_combined_export*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-combined-export"),
@@ -76,14 +78,13 @@ url_manual_mapping = (
("bpy.types.toolsettings.annotation_stroke_placement_view3d*", "interface/annotate_tool.html#bpy-types-toolsettings-annotation-stroke-placement-view3d"),
("bpy.types.fluiddomainsettings.use_collision_border_front*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-collision-border-front"),
("bpy.types.fluiddomainsettings.use_collision_border_right*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-collision-border-right"),
+ ("bpy.types.sequencertimelineoverlay.waveform_display_type*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-waveform-display-type"),
("bpy.types.cyclesmaterialsettings.use_transparent_shadow*", "render/cycles/material_settings.html#bpy-types-cyclesmaterialsettings-use-transparent-shadow"),
("bpy.types.cyclesobjectsettings.shadow_terminator_offset*", "render/cycles/object_settings/object_data.html#bpy-types-cyclesobjectsettings-shadow-terminator-offset"),
("bpy.types.cyclesobjectsettings.use_adaptive_subdivision*", "render/cycles/object_settings/adaptive_subdiv.html#bpy-types-cyclesobjectsettings-use-adaptive-subdivision"),
("bpy.types.cyclesrendersettings.debug_use_spatial_splits*", "render/cycles/render_settings/performance.html#bpy-types-cyclesrendersettings-debug-use-spatial-splits"),
("bpy.types.cyclesrendersettings.light_sampling_threshold*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-light-sampling-threshold"),
- ("bpy.types.cyclesrendersettings.preview_start_resolution*", "render/cycles/render_settings/performance.html#bpy-types-cyclesrendersettings-preview-start-resolution"),
("bpy.types.cyclesrendersettings.rolling_shutter_duration*", "render/cycles/render_settings/motion_blur.html#bpy-types-cyclesrendersettings-rolling-shutter-duration"),
- ("bpy.types.cyclesrendersettings.sample_all_lights_direct*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-sample-all-lights-direct"),
("bpy.types.cyclesrendersettings.volume_preview_step_rate*", "render/cycles/render_settings/volumes.html#bpy-types-cyclesrendersettings-volume-preview-step-rate"),
("bpy.types.fluiddomainsettings.sndparticle_update_radius*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-update-radius"),
("bpy.types.fluiddomainsettings.use_collision_border_back*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-collision-border-back"),
@@ -97,14 +98,15 @@ url_manual_mapping = (
("bpy.types.gpencilsculptsettings.use_multiframe_falloff*", "grease_pencil/multiframe.html#bpy-types-gpencilsculptsettings-use-multiframe-falloff"),
("bpy.types.movietrackingsettings.use_keyframe_selection*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-use-keyframe-selection"),
("bpy.types.rendersettings.simplify_gpencil_antialiasing*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-antialiasing"),
+ ("bpy.types.sequencertimelineoverlay.show_strip_duration*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-strip-duration"),
("bpy.types.spaceoutliner.use_filter_lib_override_system*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-lib-override-system"),
("bpy.types.toolsettings.use_transform_pivot_point_align*", "scene_layout/object/tools/tool_settings.html#bpy-types-toolsettings-use-transform-pivot-point-align"),
("bpy.types.brush.show_multiplane_scrape_planes_preview*", "sculpt_paint/sculpting/tools/multiplane_scrape.html#bpy-types-brush-show-multiplane-scrape-planes-preview"),
("bpy.types.cyclesmaterialsettings.volume_interpolation*", "render/cycles/material_settings.html#bpy-types-cyclesmaterialsettings-volume-interpolation"),
("bpy.types.cyclesrendersettings.debug_optix_curves_api*", "render/cycles/render_settings/debug.html#bpy-types-cyclesrendersettings-debug-optix-curves-api"),
+ ("bpy.types.cyclesrendersettings.denoising_input_passes*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-denoising-input-passes"),
("bpy.types.cyclesrendersettings.film_transparent_glass*", "render/cycles/render_settings/film.html#bpy-types-cyclesrendersettings-film-transparent-glass"),
("bpy.types.cyclesrendersettings.offscreen_dicing_scale*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-offscreen-dicing-scale"),
- ("bpy.types.cyclesrendersettings.use_progressive_refine*", "render/cycles/render_settings/performance.html#bpy-types-cyclesrendersettings-use-progressive-refine"),
("bpy.types.fluiddomainsettings.sndparticle_bubble_drag*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-bubble-drag"),
("bpy.types.linestylegeometrymodifier_backbonestretcher*", "render/freestyle/view_layer/line_style/modifiers/geometry/backbone_stretcher.html#bpy-types-linestylegeometrymodifier-backbonestretcher"),
("bpy.types.linestylegeometrymodifier_sinusdisplacement*", "render/freestyle/view_layer/line_style/modifiers/geometry/sinus_displacement.html#bpy-types-linestylegeometrymodifier-sinusdisplacement"),
@@ -123,6 +125,7 @@ url_manual_mapping = (
("bpy.types.gpencillayer.use_annotation_onion_skinning*", "interface/annotate_tool.html#bpy-types-gpencillayer-use-annotation-onion-skinning"),
("bpy.types.greasepencil.use_adaptive_curve_resolution*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-use-adaptive-curve-resolution"),
("bpy.types.linestylegeometrymodifier_polygonalization*", "render/freestyle/view_layer/line_style/modifiers/geometry/polygonization.html#bpy-types-linestylegeometrymodifier-polygonalization"),
+ ("bpy.types.sequencertimelineoverlay.show_strip_source*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-strip-source"),
("bpy.types.toolsettings.use_gpencil_automerge_strokes*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-automerge-strokes"),
("bpy.types.toolsettings.use_proportional_edit_objects*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-edit-objects"),
("bpy.ops.view3d.edit_mesh_extrude_move_shrink_fatten*", "modeling/meshes/editing/face/extrude_faces_normal.html#bpy-ops-view3d-edit-mesh-extrude-move-shrink-fatten"),
@@ -133,7 +136,7 @@ url_manual_mapping = (
("bpy.types.cyclesrendersettings.motion_blur_position*", "render/cycles/render_settings/motion_blur.html#bpy-types-cyclesrendersettings-motion-blur-position"),
("bpy.types.cyclesrendersettings.rolling_shutter_type*", "render/cycles/render_settings/motion_blur.html#bpy-types-cyclesrendersettings-rolling-shutter-type"),
("bpy.types.cyclesrendersettings.transmission_bounces*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-transmission-bounces"),
- ("bpy.types.cyclesrendersettings.transmission_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-transmission-samples"),
+ ("bpy.types.cyclesworldsettings.sample_map_resolution*", "render/cycles/world_settings.html#bpy-types-cyclesworldsettings-sample-map-resolution"),
("bpy.types.fluiddomainsettings.display_interpolation*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-display-interpolation"),
("bpy.types.fluiddomainsettings.gridlines_cell_filter*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-gridlines-cell-filter"),
("bpy.types.fluiddomainsettings.gridlines_color_field*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-gridlines-color-field"),
@@ -147,13 +150,13 @@ url_manual_mapping = (
("bpy.types.rendersettings_simplify_gpencil_shader_fx*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-shader-fx"),
("bpy.types.rendersettings_simplify_gpencil_view_fill*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-view-fill"),
("bpy.types.sequencertoolsettings.snap_to_hold_offset*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-snap-to-hold-offset"),
- ("bpy.types.spacesequenceeditor.waveform_display_type*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-waveform-display-type"),
("bpy.types.toolsettings.use_mesh_automerge_and_split*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-mesh-automerge-and-split"),
("bpy.types.brush.cloth_constraint_softbody_strength*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-constraint-softbody-strength"),
("bpy.types.brush.elastic_deform_volume_preservation*", "sculpt_paint/sculpting/tools/elastic_deform.html#bpy-types-brush-elastic-deform-volume-preservation"),
("bpy.types.brushgpencilsettings.fill_simplify_level*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-fill-simplify-level"),
("bpy.types.brushgpencilsettings.use_jitter_pressure*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-jitter-pressure"),
("bpy.types.brushgpencilsettings.use_settings_random*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-settings-random"),
+ ("bpy.types.cyclesrendersettings.denoising_prefilter*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-denoising-prefilter"),
("bpy.types.cyclesrendersettings.preview_dicing_rate*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-preview-dicing-rate"),
("bpy.types.cyclesrendersettings.sample_clamp_direct*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-sample-clamp-direct"),
("bpy.types.cyclesworldsettings.volume_interpolation*", "render/cycles/world_settings.html#bpy-types-cyclesworldsettings-volume-interpolation"),
@@ -166,6 +169,7 @@ url_manual_mapping = (
("bpy.types.freestylelineset.select_external_contour*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-select-external-contour"),
("bpy.types.linestylegeometrymodifier_simplification*", "render/freestyle/view_layer/line_style/modifiers/geometry/simplification.html#bpy-types-linestylegeometrymodifier-simplification"),
("bpy.types.materialgpencilstyle.use_overlap_strokes*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-use-overlap-strokes"),
+ ("bpy.types.sequencertimelineoverlay.show_strip_name*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-strip-name"),
("bpy.types.spacespreadsheet.geometry_component_type*", "editors/spreadsheet.html#bpy-types-spacespreadsheet-geometry-component-type"),
("bpy.types.toolsettings.use_gpencil_weight_data_add*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-weight-data-add"),
("bpy.types.view3doverlay.texture_paint_mode_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-texture-paint-mode-opacity"),
@@ -180,10 +184,6 @@ url_manual_mapping = (
("bpy.types.cyclesrendersettings.adaptive_threshold*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-adaptive-threshold"),
("bpy.types.cyclesrendersettings.camera_cull_margin*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-camera-cull-margin"),
("bpy.types.cyclesrendersettings.debug_use_hair_bvh*", "render/cycles/render_settings/performance.html#bpy-types-cyclesrendersettings-debug-use-hair-bvh"),
- ("bpy.types.cyclesrendersettings.mesh_light_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-mesh-light-samples"),
- ("bpy.types.cyclesrendersettings.preview_aa_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-aa-samples"),
- ("bpy.types.cyclesrendersettings.subsurface_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-subsurface-samples"),
- ("bpy.types.cyclesrendersettings.use_square_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-use-square-samples"),
("bpy.types.fluiddomainsettings.export_manta_script*", "physics/fluid/type/domain/cache.html#bpy-types-fluiddomainsettings-export-manta-script"),
("bpy.types.fluiddomainsettings.fractions_threshold*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-fractions-threshold"),
("bpy.types.fluiddomainsettings.particle_band_width*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-particle-band-width"),
@@ -201,11 +201,12 @@ url_manual_mapping = (
("bpy.types.movietrackingsettings.use_tripod_solver*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-use-tripod-solver"),
("bpy.types.rendersettings.simplify_child_particles*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-child-particles"),
("bpy.types.rendersettings.use_high_quality_normals*", "render/eevee/render_settings/performance.html#bpy-types-rendersettings-use-high-quality-normals"),
+ ("bpy.types.sequencerpreviewoverlay.show_annotation*", "video_editing/preview/introduction.html#bpy-types-sequencerpreviewoverlay-show-annotation"),
+ ("bpy.types.sequencerpreviewoverlay.show_safe_areas*", "video_editing/preview/introduction.html#bpy-types-sequencerpreviewoverlay-show-safe-areas"),
("bpy.types.sequencertoolsettings.snap_ignore_muted*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-snap-ignore-muted"),
("bpy.types.sequencertoolsettings.snap_ignore_sound*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-snap-ignore-sound"),
("bpy.types.spaceoutliner.use_filter_case_sensitive*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-case-sensitive"),
("bpy.types.spaceoutliner.use_filter_object_content*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-content"),
- ("bpy.types.spacesequenceeditor.show_strip_duration*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-duration"),
("bpy.types.toolsettings.use_proportional_connected*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-connected"),
("bpy.types.toolsettings.use_proportional_projected*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-projected"),
("bpy.types.view3doverlay.vertex_paint_mode_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-vertex-paint-mode-opacity"),
@@ -284,13 +285,13 @@ url_manual_mapping = (
("bpy.types.materialgpencilstyle.use_fill_holdout*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-use-fill-holdout"),
("bpy.types.particlesettings.use_parent_particles*", "physics/particles/emitter/render.html#bpy-types-particlesettings-use-parent-particles"),
("bpy.types.rigidbodyconstraint.solver_iterations*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-solver-iterations"),
+ ("bpy.types.sequencerpreviewoverlay.show_metadata*", "video_editing/preview/introduction.html#bpy-types-sequencerpreviewoverlay-show-metadata"),
+ ("bpy.types.sequencertimelineoverlay.show_fcurves*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-fcurves"),
("bpy.types.spaceclipeditor.use_grayscale_preview*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-use-grayscale-preview"),
("bpy.types.spaceoutliner.use_filter_lib_override*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-lib-override"),
("bpy.types.spaceoutliner.use_filter_object_empty*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-empty"),
("bpy.types.spaceoutliner.use_filter_object_light*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-light"),
("bpy.types.spacesequenceeditor.proxy_render_size*", "video_editing/preview/sidebar.html#bpy-types-spacesequenceeditor-proxy-render-size"),
- ("bpy.types.spacesequenceeditor.show_strip_offset*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-offset"),
- ("bpy.types.spacesequenceeditor.show_strip_source*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-source"),
("bpy.types.spacespreadsheetrowfilter.column_name*", "editors/spreadsheet.html#bpy-types-spacespreadsheetrowfilter-column-name"),
("bpy.types.toolsettings.gpencil_stroke_placement*", "grease_pencil/modes/draw/stroke_placement.html#bpy-types-toolsettings-gpencil-stroke-placement"),
("bpy.types.toolsettings.use_keyframe_cycle_aware*", "editors/timeline.html#bpy-types-toolsettings-use-keyframe-cycle-aware"),
@@ -301,7 +302,6 @@ url_manual_mapping = (
("bpy.types.cyclesobjectsettings.use_camera_cull*", "render/cycles/object_settings/object_data.html#bpy-types-cyclesobjectsettings-use-camera-cull"),
("bpy.types.cyclesobjectsettings.use_motion_blur*", "render/cycles/object_settings/object_data.html#bpy-types-cyclesobjectsettings-use-motion-blur"),
("bpy.types.cyclesrendersettings.diffuse_bounces*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-diffuse-bounces"),
- ("bpy.types.cyclesrendersettings.diffuse_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-diffuse-samples"),
("bpy.types.cyclesrendersettings.preview_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-samples"),
("bpy.types.cyclesrendersettings.use_camera_cull*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-use-camera-cull"),
("bpy.types.cyclesworldsettings.volume_step_size*", "render/cycles/world_settings.html#bpy-types-cyclesworldsettings-volume-step-size"),
@@ -340,9 +340,7 @@ url_manual_mapping = (
("bpy.types.cyclesmaterialsettings.displacement*", "render/cycles/material_settings.html#bpy-types-cyclesmaterialsettings-displacement"),
("bpy.types.cyclesrendersettings.debug_bvh_type*", "render/cycles/render_settings/debug.html#bpy-types-cyclesrendersettings-debug-bvh-type"),
("bpy.types.cyclesrendersettings.glossy_bounces*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-glossy-bounces"),
- ("bpy.types.cyclesrendersettings.glossy_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-glossy-samples"),
("bpy.types.cyclesrendersettings.volume_bounces*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-volume-bounces"),
- ("bpy.types.cyclesrendersettings.volume_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-volume-samples"),
("bpy.types.cyclesworldsettings.sampling_method*", "render/cycles/world_settings.html#bpy-types-cyclesworldsettings-sampling-method"),
("bpy.types.cyclesworldsettings.volume_sampling*", "render/cycles/world_settings.html#bpy-types-cyclesworldsettings-volume-sampling"),
("bpy.types.editbone.bbone_handle_use_scale_end*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-handle-use-scale-end"),
@@ -370,16 +368,12 @@ url_manual_mapping = (
("bpy.types.spacegrapheditor.show_extrapolation*", "editors/graph_editor/introduction.html#bpy-types-spacegrapheditor-show-extrapolation"),
("bpy.types.spaceoutliner.use_filter_collection*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-collection"),
("bpy.types.spacesequenceeditor.display_channel*", "video_editing/preview/sidebar.html#bpy-types-spacesequenceeditor-display-channel"),
- ("bpy.types.spacesequenceeditor.show_annotation*", "video_editing/preview/introduction.html#bpy-types-spacesequenceeditor-show-annotation"),
("bpy.types.spacesequenceeditor.show_region_hud*", "video_editing/sequencer/navigating.html#bpy-types-spacesequenceeditor-show-region-hud"),
- ("bpy.types.spacesequenceeditor.show_safe_areas*", "video_editing/preview/introduction.html#bpy-types-spacesequenceeditor-show-safe-areas"),
- ("bpy.types.spacesequenceeditor.show_strip_name*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-name"),
("bpy.types.spacespreadsheet.show_only_selected*", "editors/spreadsheet.html#bpy-types-spacespreadsheet-show-only-selected"),
("bpy.types.spacespreadsheetrowfilter.operation*", "editors/spreadsheet.html#bpy-types-spacespreadsheetrowfilter-operation"),
("bpy.types.spacespreadsheetrowfilter.threshold*", "editors/spreadsheet.html#bpy-types-spacespreadsheetrowfilter-threshold"),
("bpy.types.toolsettings.use_snap_grid_absolute*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-grid-absolute"),
("bpy.types.view3doverlay.show_face_orientation*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-show-face-orientation"),
- ("bpy.types.worldlighting.use_ambient_occlusion*", "render/cycles/world_settings.html#bpy-types-worldlighting-use-ambient-occlusion"),
("bpy.ops.object.blenderkit_material_thumbnail*", "addons/3d_view/blenderkit.html#bpy-ops-object-blenderkit-material-thumbnail"),
("bpy.ops.object.multires_higher_levels_delete*", "modeling/modifiers/generate/multiresolution.html#bpy-ops-object-multires-higher-levels-delete"),
("bpy.ops.object.vertex_group_copy_to_selected*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-copy-to-selected"),
@@ -460,9 +454,9 @@ url_manual_mapping = (
("bpy.types.sculpt.constant_detail_resolution*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-constant-detail-resolution"),
("bpy.types.spaceclipeditor.annotation_source*", "movie_clip/tracking/clip/sidebar/view.html#bpy-types-spaceclipeditor-annotation-source"),
("bpy.types.spaceclipeditor.show_blue_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-blue-channel"),
+ ("bpy.types.spacefilebrowser.system_bookmarks*", "editors/file_browser.html#bpy-types-spacefilebrowser-system-bookmarks"),
("bpy.types.spaceoutliner.use_filter_children*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-children"),
("bpy.types.spaceoutliner.use_filter_complete*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-complete"),
- ("bpy.types.spacesequenceeditor.show_metadata*", "video_editing/preview/introduction.html#bpy-types-spacesequenceeditor-show-metadata"),
("bpy.types.spacespreadsheet.attribute_domain*", "editors/spreadsheet.html#bpy-types-spacespreadsheet-attribute-domain"),
("bpy.types.spacespreadsheetrowfilter.enabled*", "editors/spreadsheet.html#bpy-types-spacespreadsheetrowfilter-enabled"),
("bpy.types.spaceview3d.transform_orientation*", "editors/3dview/controls/orientation.html#bpy-types-spaceview3d-transform-orientation"),
@@ -484,10 +478,10 @@ url_manual_mapping = (
("bpy.types.cyclesrendersettings.blur_glossy*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-blur-glossy"),
("bpy.types.cyclesrendersettings.dicing_rate*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-dicing-rate"),
("bpy.types.cyclesrendersettings.max_bounces*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-max-bounces"),
- ("bpy.types.cyclesrendersettings.progressive*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-progressive"),
("bpy.types.cyclesrendersettings.use_fast_gi*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-use-fast-gi"),
("bpy.types.editbone.bbone_custom_handle_end*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-custom-handle-end"),
("bpy.types.editbone.bbone_handle_type_start*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-handle-type-start"),
+ ("bpy.types.fileselectparams.recursion_level*", "editors/file_browser.html#bpy-types-fileselectparams-recursion-level"),
("bpy.types.fluiddomainsettings.adapt_margin*", "physics/fluid/type/domain/gas/adaptive_domain.html#bpy-types-fluiddomainsettings-adapt-margin"),
("bpy.types.fluiddomainsettings.burning_rate*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-burning-rate"),
("bpy.types.fluiddomainsettings.guide_parent*", "physics/fluid/type/domain/guides.html#bpy-types-fluiddomainsettings-guide-parent"),
@@ -516,7 +510,6 @@ url_manual_mapping = (
("bpy.types.spaceclipeditor.show_red_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-red-channel"),
("bpy.types.spaceclipeditor.use_mute_footage*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-use-mute-footage"),
("bpy.types.spacesequenceeditor.overlay_type*", "video_editing/preview/sidebar.html#bpy-types-spacesequenceeditor-overlay-type"),
- ("bpy.types.spacesequenceeditor.show_fcurves*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-fcurves"),
("bpy.types.spaceuveditor.sticky_select_mode*", "editors/uv/selecting.html#bpy-types-spaceuveditor-sticky-select-mode"),
("bpy.types.spaceview3d.show_object_viewport*", "editors/3dview/display/visibility.html#bpy-types-spaceview3d-show-object-viewport"),
("bpy.types.view3doverlay.show_fade_inactive*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-show-fade-inactive"),
@@ -536,10 +529,8 @@ url_manual_mapping = (
("bpy.types.brush.surface_smooth_iterations*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-surface-smooth-iterations"),
("bpy.types.brushgpencilsettings.pen_jitter*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-pen-jitter"),
("bpy.types.cyclescurverendersettings.shape*", "render/cycles/render_settings/hair.html#bpy-types-cyclescurverendersettings-shape"),
- ("bpy.types.cyclesrendersettings.aa_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-aa-samples"),
("bpy.types.cyclesrendersettings.ao_bounces*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-ao-bounces"),
- ("bpy.types.cyclesrendersettings.ao_samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-ao-samples"),
- ("bpy.types.cyclesrendersettings.tile_order*", "render/cycles/render_settings/performance.html#bpy-types-cyclesrendersettings-tile-order"),
+ ("bpy.types.cyclesrendersettings.time_limit*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-time-limit"),
("bpy.types.cyclesvisibilitysettings.camera*", "render/cycles/world_settings.html#bpy-types-cyclesvisibilitysettings-camera"),
("bpy.types.cyclesworldsettings.max_bounces*", "render/cycles/world_settings.html#bpy-types-cyclesworldsettings-max-bounces"),
("bpy.types.fluiddomainsettings.domain_type*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-domain-type"),
@@ -575,6 +566,8 @@ url_manual_mapping = (
("bpy.types.rendersettings.use_single_layer*", "render/layers/view_layer.html#bpy-types-rendersettings-use-single-layer"),
("bpy.types.sceneeevee.use_taa_reprojection*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-use-taa-reprojection"),
("bpy.types.sequenceeditor.use_overlay_lock*", "video_editing/preview/sidebar.html#bpy-types-sequenceeditor-use-overlay-lock"),
+ ("bpy.types.spacefilebrowser.recent_folders*", "editors/file_browser.html#bpy-types-spacefilebrowser-recent-folders"),
+ ("bpy.types.spacefilebrowser.system_folders*", "editors/file_browser.html#bpy-types-spacefilebrowser-system-folders"),
("bpy.types.spaceoutliner.use_filter_object*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object"),
("bpy.types.spacesequenceeditor.use_proxies*", "video_editing/preview/sidebar.html#bpy-types-spacesequenceeditor-use-proxies"),
("bpy.types.spaceuveditor.show_pixel_coords*", "editors/uv/sidebar.html#bpy-types-spaceuveditor-show-pixel-coords"),
@@ -606,6 +599,7 @@ url_manual_mapping = (
("bpy.types.cyclescamerasettings.longitude*", "render/cycles/object_settings/cameras.html#bpy-types-cyclescamerasettings-longitude"),
("bpy.types.editbone.bbone_handle_type_end*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-handle-type-end"),
("bpy.types.editbone.use_endroll_as_inroll*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-use-endroll-as-inroll"),
+ ("bpy.types.fileselectparams.filter_search*", "editors/file_browser.html#bpy-types-fileselectparams-filter-search"),
("bpy.types.fluiddomainsettings.cache_type*", "physics/fluid/type/domain/cache.html#bpy-types-fluiddomainsettings-cache-type"),
("bpy.types.fluiddomainsettings.flip_ratio*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-flip-ratio"),
("bpy.types.fluiddomainsettings.guide_beta*", "physics/fluid/type/domain/guides.html#bpy-types-fluiddomainsettings-guide-beta"),
@@ -674,6 +668,8 @@ url_manual_mapping = (
("bpy.types.cyclesrendersettings.caustics*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-caustics"),
("bpy.types.cyclesrendersettings.denoiser*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-denoiser"),
("bpy.types.editbone.use_inherit_rotation*", "animation/armatures/bones/properties/relations.html#bpy-types-editbone-use-inherit-rotation"),
+ ("bpy.types.fileselectparams.display_size*", "editors/file_browser.html#bpy-types-fileselectparams-display-size"),
+ ("bpy.types.fileselectparams.display_type*", "editors/file_browser.html#bpy-types-fileselectparams-display-type"),
("bpy.types.fluiddomainsettings.use_guide*", "physics/fluid/type/domain/guides.html#bpy-types-fluiddomainsettings-use-guide"),
("bpy.types.fluiddomainsettings.use_noise*", "physics/fluid/type/domain/gas/noise.html#bpy-types-fluiddomainsettings-use-noise"),
("bpy.types.fluiddomainsettings.use_slice*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-use-slice"),
@@ -736,6 +732,8 @@ url_manual_mapping = (
("bpy.types.compositornodebrightcontrast*", "compositing/types/color/bright_contrast.html#bpy-types-compositornodebrightcontrast"),
("bpy.types.compositornodedoubleedgemask*", "compositing/types/matte/double_edge_mask.html#bpy-types-compositornodedoubleedgemask"),
("bpy.types.cyclesrendersettings.samples*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-samples"),
+ ("bpy.types.fileselectparams.show_hidden*", "editors/file_browser.html#bpy-types-fileselectparams-show-hidden"),
+ ("bpy.types.fileselectparams.sort_method*", "editors/file_browser.html#bpy-types-fileselectparams-sort-method"),
("bpy.types.fluiddomainsettings.clipping*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-clipping"),
("bpy.types.fluiddomainsettings.use_mesh*", "physics/fluid/type/domain/liquid/mesh.html#bpy-types-fluiddomainsettings-use-mesh"),
("bpy.types.freestylelinestyle.angle_max*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-angle-max"),
@@ -752,6 +750,7 @@ url_manual_mapping = (
("bpy.types.object.use_empty_image_alpha*", "modeling/empties.html#bpy-types-object-use-empty-image-alpha"),
("bpy.types.rendersettings.frame_map_new*", "render/output/properties/frame_range.html#bpy-types-rendersettings-frame-map-new"),
("bpy.types.rendersettings.frame_map_old*", "render/output/properties/frame_range.html#bpy-types-rendersettings-frame-map-old"),
+ ("bpy.types.rendersettings.use_auto_tile*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-use-auto-tile"),
("bpy.types.rendersettings.use_overwrite*", "render/output/properties/output.html#bpy-types-rendersettings-use-overwrite"),
("bpy.types.rendersettings.use_sequencer*", "render/output/properties/post_processing.html#bpy-types-rendersettings-use-sequencer"),
("bpy.types.sceneeevee.volumetric_shadow*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric-shadow"),
@@ -797,6 +796,7 @@ url_manual_mapping = (
("bpy.types.compositornodesetalpha.mode*", "compositing/types/converter/set_alpha.html#bpy-types-compositornodesetalpha-mode"),
("bpy.types.dopesheet.use_filter_invert*", "editors/graph_editor/channels.html#bpy-types-dopesheet-use-filter-invert"),
("bpy.types.editbone.use_local_location*", "animation/armatures/bones/properties/relations.html#bpy-types-editbone-use-local-location"),
+ ("bpy.types.fileselectparams.use_filter*", "editors/file_browser.html#bpy-types-fileselectparams-use-filter"),
("bpy.types.fluiddomainsettings.gravity*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-gravity"),
("bpy.types.fluidflowsettings.flow_type*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-flow-type"),
("bpy.types.fluidflowsettings.subframes*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-subframes"),
@@ -868,6 +868,7 @@ url_manual_mapping = (
("bpy.types.compositornodecolorbalance*", "compositing/types/color/color_balance.html#bpy-types-compositornodecolorbalance"),
("bpy.types.compositornodekeyingscreen*", "compositing/types/matte/keying_screen.html#bpy-types-compositornodekeyingscreen"),
("bpy.types.dynamicpaintcanvassettings*", "physics/dynamic_paint/canvas.html#bpy-types-dynamicpaintcanvassettings"),
+ ("bpy.types.fileselectparams.directory*", "editors/file_browser.html#bpy-types-fileselectparams-directory"),
("bpy.types.fluidflowsettings.use_flow*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-use-flow"),
("bpy.types.fmodifierfunctiongenerator*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierfunctiongenerator"),
("bpy.types.geometrynodeattributeclamp*", "modeling/geometry_nodes/attribute/attribute_clamp.html#bpy-types-geometrynodeattributeclamp"),
@@ -891,6 +892,7 @@ url_manual_mapping = (
("bpy.types.shadernodeambientocclusion*", "render/shader_nodes/input/ao.html#bpy-types-shadernodeambientocclusion"),
("bpy.types.shadernodevolumeabsorption*", "render/shader_nodes/shader/volume_absorption.html#bpy-types-shadernodevolumeabsorption"),
("bpy.types.shadernodevolumeprincipled*", "render/shader_nodes/shader/volume_principled.html#bpy-types-shadernodevolumeprincipled"),
+ ("bpy.types.spacefilebrowser.bookmarks*", "editors/file_browser.html#bpy-types-spacefilebrowser-bookmarks"),
("bpy.types.spaceoutliner.display_mode*", "editors/outliner/interface.html#bpy-types-spaceoutliner-display-mode"),
("bpy.types.spaceoutliner.filter_state*", "editors/outliner/interface.html#bpy-types-spaceoutliner-filter-state"),
("bpy.types.toolsettings.keyframe_type*", "editors/timeline.html#bpy-types-toolsettings-keyframe-type"),
@@ -940,6 +942,7 @@ url_manual_mapping = (
("bpy.types.cyclesrendersettings.seed*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-seed"),
("bpy.types.dynamicpaintbrushsettings*", "physics/dynamic_paint/brush.html#bpy-types-dynamicpaintbrushsettings"),
("bpy.types.editbone.use_scale_easing*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-use-scale-easing"),
+ ("bpy.types.fileselectparams.filename*", "editors/file_browser.html#bpy-types-fileselectparams-filename"),
("bpy.types.fluiddomainsettings.alpha*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-alpha"),
("bpy.types.fluidflowsettings.density*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-density"),
("bpy.types.freestylelineset.qi_start*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-qi-start"),
@@ -1048,6 +1051,8 @@ url_manual_mapping = (
("bpy.types.nodesocketinterface.name*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-name"),
("bpy.types.object.is_shadow_catcher*", "render/cycles/object_settings/object_data.html#bpy-types-object-is-shadow-catcher"),
("bpy.types.particleinstancemodifier*", "modeling/modifiers/physics/particle_instance.html#bpy-types-particleinstancemodifier"),
+ ("bpy.types.rendersettings.tile_size*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-size"),
+ ("bpy.types.sequencertimelineoverlay*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay"),
("bpy.types.sequencetransform.offset*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sequencetransform-offset"),
("bpy.types.shadernodebrightcontrast*", "render/shader_nodes/color/bright_contrast.html#bpy-types-shadernodebrightcontrast"),
("bpy.types.shadernodebsdfprincipled*", "render/shader_nodes/shader/principled.html#bpy-types-shadernodebsdfprincipled"),
@@ -1143,6 +1148,7 @@ url_manual_mapping = (
("bpy.types.rendersettings.fps_base*", "render/output/properties/format.html#bpy-types-rendersettings-fps-base"),
("bpy.types.rigidbodyobject.enabled*", "physics/rigid_body/properties/settings.html#bpy-types-rigidbodyobject-enabled"),
("bpy.types.sceneeevee.use_overscan*", "render/eevee/render_settings/film.html#bpy-types-sceneeevee-use-overscan"),
+ ("bpy.types.sequencerpreviewoverlay*", "video_editing/preview/introduction.html#bpy-types-sequencerpreviewoverlay"),
("bpy.types.sequencetransform.scale*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sequencetransform-scale"),
("bpy.types.shadernodeeeveespecular*", "render/shader_nodes/shader/specular_bsdf.html#bpy-types-shadernodeeeveespecular"),
("bpy.types.shadernodehuesaturation*", "render/shader_nodes/color/hue_saturation.html#bpy-types-shadernodehuesaturation"),
@@ -1153,7 +1159,7 @@ url_manual_mapping = (
("bpy.types.vertexweightmixmodifier*", "modeling/modifiers/modify/weight_mix.html#bpy-types-vertexweightmixmodifier"),
("bpy.types.viewlayer.use_freestyle*", "render/freestyle/view_layer/freestyle.html#bpy-types-viewlayer-use-freestyle"),
("bpy.types.volumedisplay.use_slice*", "modeling/volumes/properties.html#bpy-types-volumedisplay-use-slice"),
- ("bpy.types.worldlighting.ao_factor*", "render/cycles/world_settings.html#bpy-types-worldlighting-ao-factor"),
+ ("bpy.types.worldlighting.ao_factor*", "render/cycles/render_settings/light_paths.html#bpy-types-worldlighting-ao-factor"),
("bpy.types.worldmistsettings.depth*", "render/cycles/world_settings.html#bpy-types-worldmistsettings-depth"),
("bpy.types.worldmistsettings.start*", "render/cycles/world_settings.html#bpy-types-worldmistsettings-start"),
("bpy.ops.armature.armature_layers*", "animation/armatures/bones/editing/change_layers.html#bpy-ops-armature-armature-layers"),
@@ -1255,11 +1261,11 @@ url_manual_mapping = (
("bpy.types.shadernodevectorrotate*", "render/shader_nodes/vector/vector_rotate.html#bpy-types-shadernodevectorrotate"),
("bpy.types.sound.use_memory_cache*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sound-use-memory-cache"),
("bpy.types.spaceview3d.show_gizmo*", "editors/3dview/display/gizmo.html#bpy-types-spaceview3d-show-gizmo"),
- ("bpy.types.texturegpencilmodifier*", "grease_pencil/modifiers/color/texture_mapping.html#bpy-types-texturegpencilmodifier"),
+ ("bpy.types.texturegpencilmodifier*", "grease_pencil/modifiers/modify/texture_mapping.html#bpy-types-texturegpencilmodifier"),
("bpy.types.volumedisplacemodifier*", "modeling/modifiers/deform/volume_displace.html#bpy-types-volumedisplacemodifier"),
("bpy.types.volumerender.step_size*", "modeling/volumes/properties.html#bpy-types-volumerender-step-size"),
("bpy.types.weightednormalmodifier*", "modeling/modifiers/modify/weighted_normal.html#bpy-types-weightednormalmodifier"),
- ("bpy.types.worldlighting.distance*", "render/cycles/world_settings.html#bpy-types-worldlighting-distance"),
+ ("bpy.types.worldlighting.distance*", "render/cycles/render_settings/light_paths.html#bpy-types-worldlighting-distance"),
("bpy.ops.armature.autoside_names*", "animation/armatures/bones/editing/naming.html#bpy-ops-armature-autoside-names"),
("bpy.ops.armature.calculate_roll*", "animation/armatures/bones/editing/bone_roll.html#bpy-ops-armature-calculate-roll"),
("bpy.ops.armature.duplicate_move*", "animation/armatures/bones/editing/duplicate.html#bpy-ops-armature-duplicate-move"),
@@ -1360,8 +1366,6 @@ url_manual_mapping = (
("bpy.types.object.visible_shadow*", "render/cycles/object_settings/object_data.html#bpy-types-object-visible-shadow"),
("bpy.types.offsetgpencilmodifier*", "grease_pencil/modifiers/deform/offset.html#bpy-types-offsetgpencilmodifier"),
("bpy.types.posebone.custom_shape*", "animation/armatures/bones/properties/display.html#bpy-types-posebone-custom-shape"),
- ("bpy.types.rendersettings.tile_x*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-x"),
- ("bpy.types.rendersettings.tile_y*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-y"),
("bpy.types.rigifyselectioncolors*", "addons/rigging/rigify/metarigs.html#bpy-types-rigifyselectioncolors"),
("bpy.types.sceneeevee.volumetric*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric"),
("bpy.types.screen.show_statusbar*", "interface/window_system/topbar.html#bpy-types-screen-show-statusbar"),
@@ -1573,7 +1577,7 @@ url_manual_mapping = (
("bpy.types.stretchtoconstraint*", "animation/constraints/tracking/stretch_to.html#bpy-types-stretchtoconstraint"),
("bpy.types.texturenodecurvergb*", "editors/texture_node/types/color/rgb_curves.html#bpy-types-texturenodecurvergb"),
("bpy.types.texturenodevaltorgb*", "editors/texture_node/types/converter/rgb_to_bw.html#bpy-types-texturenodevaltorgb"),
- ("bpy.types.timegpencilmodifier*", "grease_pencil/modifiers/deform/time_offset.html#bpy-types-timegpencilmodifier"),
+ ("bpy.types.timegpencilmodifier*", "grease_pencil/modifiers/modify/time_offset.html#bpy-types-timegpencilmodifier"),
("bpy.types.tintgpencilmodifier*", "grease_pencil/modifiers/color/tint.html#bpy-types-tintgpencilmodifier"),
("bpy.types.transformconstraint*", "animation/constraints/transform/transformation.html#bpy-types-transformconstraint"),
("bpy.types.triangulatemodifier*", "modeling/modifiers/generate/triangulate.html#bpy-types-triangulatemodifier"),
@@ -1652,6 +1656,7 @@ url_manual_mapping = (
("bpy.types.curve.twist_smooth*", "modeling/curves/properties/shape.html#bpy-types-curve-twist-smooth"),
("bpy.types.curvepaintsettings*", "modeling/curves/tools/draw.html#bpy-types-curvepaintsettings"),
("bpy.types.fcurve.array_index*", "editors/graph_editor/fcurves/properties.html#bpy-types-fcurve-array-index"),
+ ("bpy.types.fileselectidfilter*", "editors/file_browser.html#bpy-types-fileselectidfilter"),
("bpy.types.fmodifiergenerator*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifiergenerator"),
("bpy.types.freestylelinestyle*", "render/freestyle/view_layer/line_style/index.html#bpy-types-freestylelinestyle"),
("bpy.types.gammacrosssequence*", "video_editing/sequencer/strips/transitions/gamma_cross.html#bpy-types-gammacrosssequence"),
@@ -1820,6 +1825,7 @@ url_manual_mapping = (
("bpy.ops.clip.track_markers*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-track-markers"),
("bpy.ops.curve.extrude_move*", "modeling/curves/editing/control_points.html#bpy-ops-curve-extrude-move"),
("bpy.ops.curve.make_segment*", "modeling/curves/editing/control_points.html#bpy-ops-curve-make-segment"),
+ ("bpy.ops.file.directory_new*", "editors/file_browser.html#bpy-ops-file-directory-new"),
("bpy.ops.graph.euler_filter*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-euler-filter"),
("bpy.ops.marker.camera_bind*", "animation/markers.html#bpy-ops-marker-camera-bind"),
("bpy.ops.mask.select_circle*", "movie_clip/masking/selecting.html#bpy-ops-mask-select-circle"),
@@ -1874,6 +1880,7 @@ url_manual_mapping = (
("bpy.types.editbone.bbone_x*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-x"),
("bpy.types.editbone.bbone_z*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-z"),
("bpy.types.fcurve.data_path*", "editors/graph_editor/fcurves/properties.html#bpy-types-fcurve-data-path"),
+ ("bpy.types.fileselectparams*", "editors/file_browser.html#bpy-types-fileselectparams"),
("bpy.types.fmodifierstepped*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierstepped"),
("bpy.types.freestylelineset*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset"),
("bpy.types.mask.frame_start*", "movie_clip/masking/sidebar.html#bpy-types-mask-frame-start"),
@@ -1904,6 +1911,7 @@ url_manual_mapping = (
("bpy.types.softbodymodifier*", "physics/soft_body/index.html#bpy-types-softbodymodifier"),
("bpy.types.softbodysettings*", "physics/soft_body/settings/index.html#bpy-types-softbodysettings"),
("bpy.types.solidifymodifier*", "modeling/modifiers/generate/solidify.html#bpy-types-solidifymodifier"),
+ ("bpy.types.spacefilebrowser*", "editors/file_browser.html#bpy-types-spacefilebrowser"),
("bpy.types.spacegrapheditor*", "editors/graph_editor/index.html#bpy-types-spacegrapheditor"),
("bpy.types.spacepreferences*", "editors/preferences/index.html#bpy-types-spacepreferences"),
("bpy.types.spacespreadsheet*", "editors/spreadsheet.html#bpy-types-spacespreadsheet"),
@@ -1923,6 +1931,7 @@ url_manual_mapping = (
("bpy.ops.clip.solve_camera*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-solve-camera"),
("bpy.ops.constraint.delete*", "animation/constraints/interface/header.html#bpy-ops-constraint-delete"),
("bpy.ops.curve.smooth_tilt*", "modeling/curves/editing/control_points.html#bpy-ops-curve-smooth-tilt"),
+ ("bpy.ops.file.reset_recent*", "editors/file_browser.html#bpy-ops-file-reset-recent"),
("bpy.ops.fluid.bake_guides*", "physics/fluid/type/domain/guides.html#bpy-ops-fluid-bake-guides"),
("bpy.ops.fluid.free_guides*", "physics/fluid/type/domain/guides.html#bpy-ops-fluid-free-guides"),
("bpy.ops.font.style_toggle*", "modeling/texts/editing.html#bpy-ops-font-style-toggle"),
@@ -2252,6 +2261,7 @@ url_manual_mapping = (
("bpy.ops.clip.prefetch*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-prefetch"),
("bpy.ops.clip.set_axis*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-set-axis"),
("bpy.ops.file.pack_all*", "files/blend/packed_data.html#bpy-ops-file-pack-all"),
+ ("bpy.ops.file.previous*", "editors/file_browser.html#bpy-ops-file-previous"),
("bpy.ops.gpencil.paste*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-paste"),
("bpy.ops.image.project*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-ops-image-project"),
("bpy.ops.image.replace*", "editors/image/editing.html#bpy-ops-image-replace"),
@@ -2300,6 +2310,8 @@ url_manual_mapping = (
("bpy.ops.curve.delete*", "modeling/curves/editing/curve.html#bpy-ops-curve-delete"),
("bpy.ops.curve.reveal*", "modeling/curves/editing/curve.html#bpy-ops-curve-reveal"),
("bpy.ops.curve.smooth*", "modeling/curves/editing/control_points.html#bpy-ops-curve-smooth"),
+ ("bpy.ops.file.execute*", "editors/file_browser.html#bpy-ops-file-execute"),
+ ("bpy.ops.file.refresh*", "editors/file_browser.html#bpy-ops-file-refresh"),
("bpy.ops.fluid.preset*", "physics/fluid/type/domain/liquid/diffusion.html#bpy-ops-fluid-preset"),
("bpy.ops.gpencil.copy*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-copy"),
("bpy.ops.graph.delete*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-delete"),
@@ -2341,6 +2353,8 @@ url_manual_mapping = (
("bpy.types.vectorfont*", "modeling/texts/index.html#bpy-types-vectorfont"),
("bpy.ops.clip.reload*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-reload"),
("bpy.ops.curve.split*", "modeling/curves/editing/curve.html#bpy-ops-curve-split"),
+ ("bpy.ops.file.cancel*", "editors/file_browser.html#bpy-ops-file-cancel"),
+ ("bpy.ops.file.parent*", "editors/file_browser.html#bpy-ops-file-parent"),
("bpy.ops.graph.clean*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-clean"),
("bpy.ops.graph.paste*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-paste"),
("bpy.ops.mesh.bisect*", "modeling/meshes/editing/mesh/bisect.html#bpy-ops-mesh-bisect"),
@@ -2420,6 +2434,7 @@ url_manual_mapping = (
("bpy.types.spacenla*", "editors/nla/index.html#bpy-types-spacenla"),
("bpy.types.sunlight*", "render/lights/light_object.html#bpy-types-sunlight"),
("bpy.ops.clip.open*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-open"),
+ ("bpy.ops.file.next*", "editors/file_browser.html#bpy-ops-file-next"),
("bpy.ops.image.new*", "editors/image/editing.html#bpy-ops-image-new"),
("bpy.ops.mesh.fill*", "modeling/meshes/editing/face/fill.html#bpy-ops-mesh-fill"),
("bpy.ops.mesh.poke*", "modeling/meshes/editing/face/poke_faces.html#bpy-ops-mesh-poke"),
@@ -2530,6 +2545,7 @@ url_manual_mapping = (
("bpy.ops.anim*", "animation/index.html#bpy-ops-anim"),
("bpy.ops.boid*", "physics/particles/emitter/physics/boids.html#bpy-ops-boid"),
("bpy.ops.clip*", "movie_clip/index.html#bpy-ops-clip"),
+ ("bpy.ops.file*", "editors/file_browser.html#bpy-ops-file"),
("bpy.ops.font*", "modeling/texts/index.html#bpy-ops-font"),
("bpy.ops.mask*", "movie_clip/masking/index.html#bpy-ops-mask"),
("bpy.ops.mesh*", "modeling/meshes/index.html#bpy-ops-mesh"),
diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py
index 26a2f9ad89b..6d92c94a85c 100644
--- a/release/scripts/modules/rna_prop_ui.py
+++ b/release/scripts/modules/rna_prop_ui.py
@@ -21,9 +21,10 @@
import bpy
from mathutils import Vector
+from bpy.types import bpy_prop_array
from idprop.types import IDPropertyArray, IDPropertyGroup
-ARRAY_TYPES = (list, tuple, IDPropertyArray, Vector)
+ARRAY_TYPES = (list, tuple, IDPropertyArray, Vector, bpy_prop_array)
# Maximum length of an array property for which a multi-line
# edit field will be displayed in the Custom Properties panel.
@@ -136,7 +137,7 @@ def draw(layout, context, context_member, property_type, *, use_edit=True):
def assign_props(prop, val, key):
prop.data_path = context_member
- prop.property = key
+ prop.property_name = key
try:
prop.value = str(val)
diff --git a/release/scripts/presets/keyconfig/Blender.py b/release/scripts/presets/keyconfig/Blender.py
index 15cc6097979..1852e150589 100644
--- a/release/scripts/presets/keyconfig/Blender.py
+++ b/release/scripts/presets/keyconfig/Blender.py
@@ -8,6 +8,7 @@ from bpy.props import (
DIRNAME, FILENAME = os.path.split(__file__)
IDNAME = os.path.splitext(FILENAME)[0]
+
def update_fn(_self, _context):
load()
@@ -54,12 +55,18 @@ class Prefs(bpy.types.KeyConfigPreferences):
default='PLAY',
update=update_fn,
)
- use_key_activate_tools: BoolProperty(
- name="Keys Activate Tools",
+ tool_key_mode: EnumProperty(
+ name="Tool Keys:",
description=(
- "Key shortcuts such as G, R, and S activate the tool instead of running it immediately"
+ "The method of keys to activate tools such as move, rotate & scale (G, R, S)"
),
- default=False,
+ items=(
+ ('IMMEDIATE', "Immediate",
+ "Activate actions immediately"),
+ ('TOOL', "Active Tool",
+ "Activate the tool for editors that support tools"),
+ ),
+ default='IMMEDIATE',
update=update_fn,
)
@@ -85,14 +92,28 @@ class Prefs(bpy.types.KeyConfigPreferences):
default=False,
update=update_fn,
)
+ # NOTE: expose `use_alt_tool` and `use_alt_cursor` as two options in the UI
+ # as the tool-tips and titles are different enough depending on RMB/LMB select.
use_alt_tool: BoolProperty(
name="Alt Tool Access",
description=(
- "Hold Alt to use the active tool when the gizmo would normally be required"
+ "Hold Alt to use the active tool when the gizmo would normally be required\n"
+ "Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used"
+ ),
+ default=False,
+ update=update_fn,
+ )
+ use_alt_cursor: BoolProperty(
+ name="Alt Cursor Access",
+ description=(
+ "Hold Alt-LMB to place the Cursor (instead of LMB), allows tools to activate on press instead of drag.\n"
+ "Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used"
),
default=False,
update=update_fn,
)
+ # end note.
+
use_select_all_toggle: BoolProperty(
name="Select All Toggles",
description=(
@@ -196,39 +217,63 @@ class Prefs(bpy.types.KeyConfigPreferences):
update=update_fn,
)
+ use_file_single_click: BoolProperty(
+ name="Open Folders on Single Click",
+ description=(
+ "Navigate into folders by clicking on them once instead of twice"
+ ),
+ default=False,
+ update=update_fn,
+ )
+
def draw(self, layout):
+ from bpy import context
+
layout.use_property_split = True
layout.use_property_decorate = False
+ prefs = context.preferences
+
is_select_left = (self.select_mouse == 'LEFT')
+ use_mouse_emulate_3_button = (
+ prefs.inputs.use_mouse_emulate_3_button and
+ prefs.inputs.mouse_emulate_3_button_modifier == 'ALT'
+ )
# General settings.
col = layout.column()
- col.row().prop(self, "select_mouse", text="Select with Mouse Button", expand=True)
- col.row().prop(self, "spacebar_action", text="Spacebar Action", expand=True)
+ col.row().prop(self, "select_mouse", text="Select with Mouse Button:", expand=True)
+ col.row().prop(self, "spacebar_action", text="Spacebar Action:", expand=True)
if is_select_left:
- col.row().prop(self, "gizmo_action", text="Activate Gizmo Event", expand=True)
+ col.row().prop(self, "gizmo_action", text="Activate Gizmo Event:", expand=True)
else:
- col.row().prop(self, "rmb_action", text="Right Mouse Select Action", expand=True)
+ col.row().prop(self, "rmb_action", text="Right Mouse Select Action:", expand=True)
- # Checkboxes sub-layout.
+ col.row().prop(self, "tool_key_mode", expand=True)
+
+ # Check-box sub-layout.
col = layout.column()
sub = col.column(align=True)
row = sub.row()
row.prop(self, "use_alt_click_leader")
+
+ rowsub = row.row()
if is_select_left:
- row.prop(self, "use_alt_tool")
+ rowsub.prop(self, "use_alt_tool")
+ else:
+ rowsub.prop(self, "use_alt_cursor")
+ rowsub.active = not use_mouse_emulate_3_button
+
row = sub.row()
row.prop(self, "use_select_all_toggle")
- row.prop(self, "use_key_activate_tools", text="Key Activates Tools")
# 3DView settings.
col = layout.column()
col.label(text="3D View")
- col.row().prop(self, "v3d_tilde_action", text="Grave Accent / Tilde Action", expand=True)
- col.row().prop(self, "v3d_mmb_action", text="Middle Mouse Action", expand=True)
- col.row().prop(self, "v3d_alt_mmb_drag_action", text="Alt Middle Mouse Drag Action", expand=True)
+ col.row().prop(self, "v3d_tilde_action", text="Grave Accent / Tilde Action:", expand=True)
+ col.row().prop(self, "v3d_mmb_action", text="Middle Mouse Action:", expand=True)
+ col.row().prop(self, "v3d_alt_mmb_drag_action", text="Alt Middle Mouse Drag Action:", expand=True)
# Checkboxes sub-layout.
col = layout.column()
@@ -237,6 +282,10 @@ class Prefs(bpy.types.KeyConfigPreferences):
sub.prop(self, "use_pie_click_drag")
sub.prop(self, "use_v3d_shade_ex_pie")
+ # File Browser settings.
+ col = layout.column()
+ col.label(text="File Browser")
+ col.row().prop(self, "use_file_single_click")
blender_default = bpy.utils.execfile(os.path.join(DIRNAME, "keymap_data", "blender_default.py"))
@@ -250,29 +299,33 @@ def load():
kc = context.window_manager.keyconfigs.new(IDNAME)
kc_prefs = kc.preferences
+ is_select_left = (kc_prefs.select_mouse == 'LEFT')
+ use_mouse_emulate_3_button = (
+ prefs.inputs.use_mouse_emulate_3_button and
+ prefs.inputs.mouse_emulate_3_button_modifier == 'ALT'
+ )
+
keyconfig_data = blender_default.generate_keymaps(
blender_default.Params(
select_mouse=kc_prefs.select_mouse,
- use_mouse_emulate_3_button=(
- prefs.inputs.use_mouse_emulate_3_button and
- prefs.inputs.mouse_emulate_3_button_modifier == 'ALT'
- ),
+ use_mouse_emulate_3_button=use_mouse_emulate_3_button,
spacebar_action=kc_prefs.spacebar_action,
- use_key_activate_tools=kc_prefs.use_key_activate_tools,
+ use_key_activate_tools=(kc_prefs.tool_key_mode == 'TOOL'),
v3d_tilde_action=kc_prefs.v3d_tilde_action,
use_v3d_mmb_pan=(kc_prefs.v3d_mmb_action == 'PAN'),
v3d_alt_mmb_drag_action=kc_prefs.v3d_alt_mmb_drag_action,
use_select_all_toggle=kc_prefs.use_select_all_toggle,
use_v3d_tab_menu=kc_prefs.use_v3d_tab_menu,
use_v3d_shade_ex_pie=kc_prefs.use_v3d_shade_ex_pie,
- use_gizmo_drag=(
- kc_prefs.select_mouse == 'LEFT' and
- kc_prefs.gizmo_action == 'DRAG'
+ use_gizmo_drag=(is_select_left and kc_prefs.gizmo_action == 'DRAG'),
+ use_fallback_tool=(True if is_select_left else (kc_prefs.rmb_action == 'FALLBACK_TOOL')),
+ use_alt_tool_or_cursor=(
+ (not use_mouse_emulate_3_button) and
+ (kc_prefs.use_alt_tool if is_select_left else kc_prefs.use_alt_cursor)
),
- use_fallback_tool=(True if (kc_prefs.select_mouse == 'LEFT') else (kc_prefs.rmb_action == 'FALLBACK_TOOL')),
- use_alt_tool=(kc_prefs.use_alt_tool and kc_prefs.select_mouse == 'LEFT'),
use_alt_click_leader=kc_prefs.use_alt_click_leader,
use_pie_click_drag=kc_prefs.use_pie_click_drag,
+ use_file_single_click=kc_prefs.use_file_single_click,
),
)
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 5ecbe7715e3..35eb6490265 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -31,14 +31,14 @@ class Params:
"action_tweak",
"tool_mouse",
"tool_tweak",
+ "tool_maybe_tweak",
+ "tool_maybe_tweak_value",
"context_menu_event",
"cursor_set_event",
"cursor_tweak_event",
"use_mouse_emulate_3_button",
- # Experimental option.
- "pie_value",
- # User preferences.
+ # User preferences:
#
# Swap 'Space/Shift-Space'.
"spacebar_action",
@@ -66,14 +66,26 @@ class Params:
# Alt-MMB axis switching 'RELATIVE' or 'ABSOLUTE' axis switching.
"v3d_alt_mmb_drag_action",
+ "use_file_single_click",
# Convenience variables:
# (derived from other settings).
#
# This case needs to be checked often,
- # convenience for: `params.use_fallback_tool if params.select_mouse == 'RIGHT' else False`.
+ # Shorthand for: `(params.use_fallback_tool if params.select_mouse == 'RIGHT' else False)`.
"use_fallback_tool_rmb",
- # Convenience for: `'CLICK' if params.use_fallback_tool_rmb else params.select_mouse_value`.
+ # Shorthand for: `('CLICK' if params.use_fallback_tool_rmb else params.select_mouse_value)`.
"select_mouse_value_fallback",
+ # Shorthand for: `('CLICK_DRAG' if params.use_pie_click_drag else 'PRESS')`
+ "pie_value",
+ # Shorthand for: `{"type": params.tool_tweak, "value": 'ANY'}`.
+ "tool_tweak_event",
+ # Shorthand for: `{"type": params.tool_maybe_tweak, "value": params.tool_maybe_tweak_value}`.
+ #
+ # NOTE: This is typically used for active tool key-map items however it should never
+ # be used for selection tools (the default box-select tool for example).
+ # Since this means with RMB select enabled in edit-mode for e.g.
+ # `Ctrl-LMB` would be caught by box-select instead of add/extrude.
+ "tool_maybe_tweak_event",
)
def __init__(
@@ -92,9 +104,10 @@ class Params:
use_v3d_tab_menu=False,
use_v3d_shade_ex_pie=False,
use_v3d_mmb_pan=False,
- use_alt_tool=False,
+ use_alt_tool_or_cursor=False,
use_alt_click_leader=False,
use_pie_click_drag=False,
+ use_file_single_click=False,
v3d_tilde_action='VIEW',
v3d_alt_mmb_drag_action='RELATIVE',
):
@@ -102,6 +115,9 @@ class Params:
self.apple = (platform == 'darwin')
self.legacy = legacy
+ if use_mouse_emulate_3_button:
+ assert(use_alt_tool_or_cursor is False)
+
if select_mouse == 'RIGHT':
# Right mouse select.
self.select_mouse = 'RIGHTMOUSE'
@@ -111,12 +127,23 @@ class Params:
self.action_tweak = 'EVT_TWEAK_L'
self.tool_mouse = 'LEFTMOUSE'
self.tool_tweak = 'EVT_TWEAK_L'
+ if use_alt_tool_or_cursor:
+ self.tool_maybe_tweak = 'LEFTMOUSE'
+ self.tool_maybe_tweak_value = 'PRESS'
+ else:
+ self.tool_maybe_tweak = 'EVT_TWEAK_L'
+ self.tool_maybe_tweak_value = 'ANY'
+
self.context_menu_event = {"type": 'W', "value": 'PRESS'}
- self.cursor_set_event = {"type": 'LEFTMOUSE', "value": 'CLICK'}
+
+ # Use the "cursor" functionality for RMB select.
+ if use_alt_tool_or_cursor:
+ self.cursor_set_event = {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}
+ else:
+ self.cursor_set_event = {"type": 'LEFTMOUSE', "value": 'CLICK'}
+
self.cursor_tweak_event = None
self.use_fallback_tool = use_fallback_tool
- self.use_fallback_tool_rmb = use_fallback_tool
- self.select_mouse_value_fallback = 'CLICK' if self.use_fallback_tool_rmb else self.select_mouse_value
self.tool_modifier = {}
else:
# Left mouse select uses Click event for selection. This is a little
@@ -129,6 +156,8 @@ class Params:
self.action_tweak = 'EVT_TWEAK_R'
self.tool_mouse = 'LEFTMOUSE'
self.tool_tweak = 'EVT_TWEAK_L'
+ self.tool_maybe_tweak = 'EVT_TWEAK_L'
+ self.tool_maybe_tweak_value = 'ANY'
if self.legacy:
self.context_menu_event = {"type": 'W', "value": 'PRESS'}
@@ -138,10 +167,9 @@ class Params:
self.cursor_set_event = {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}
self.cursor_tweak_event = {"type": 'EVT_TWEAK_R', "value": 'ANY', "shift": True}
self.use_fallback_tool = True
- self.use_fallback_tool_rmb = False
- self.select_mouse_value_fallback = self.select_mouse_value
- if use_alt_tool:
+ # Use the "tool" functionality for LMB select.
+ if use_alt_tool_or_cursor:
# Allow `Alt` to be pressed or not.
self.tool_modifier = {"alt": -1}
else:
@@ -149,7 +177,7 @@ class Params:
self.use_mouse_emulate_3_button = use_mouse_emulate_3_button
- # User preferences
+ # User preferences:
self.spacebar_action = spacebar_action
self.use_key_activate_tools = use_key_activate_tools
@@ -163,10 +191,15 @@ class Params:
self.use_alt_click_leader = use_alt_click_leader
self.use_pie_click_drag = use_pie_click_drag
- if not use_pie_click_drag:
- self.pie_value = 'PRESS'
- else:
- self.pie_value = 'CLICK_DRAG'
+
+ self.use_file_single_click = use_file_single_click
+
+ # Convenience variables:
+ self.use_fallback_tool_rmb = self.use_fallback_tool if self.select_mouse == 'RIGHT' else False
+ self.select_mouse_value_fallback = 'CLICK' if self.use_fallback_tool_rmb else self.select_mouse_value
+ self.pie_value = 'CLICK_DRAG' if use_pie_click_drag else 'PRESS'
+ self.tool_tweak_event = {"type": self.tool_tweak, "value": 'ANY'}
+ self.tool_maybe_tweak_event = {"type": self.tool_maybe_tweak, "value": self.tool_maybe_tweak_value}
# ------------------------------------------------------------------------------
@@ -188,6 +221,13 @@ def _fallback_id(text, fallback):
return text
+def any_except(*args):
+ mod = {"ctrl": -1, "alt": -1, "shift": -1, "oskey": -1}
+ for arg in args:
+ del mod[arg]
+ return mod
+
+
# ------------------------------------------------------------------------------
# Keymap Item Wrappers
@@ -300,20 +340,23 @@ def _template_items_object_subdivision_set():
def _template_items_gizmo_tweak_value():
return [
- ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("gizmogroup.gizmo_tweak",
+ {"type": 'LEFTMOUSE', "value": 'PRESS', **any_except("alt")}, None),
]
def _template_items_gizmo_tweak_value_click_drag():
return [
- ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'CLICK', "any": True}, None),
- ("gizmogroup.gizmo_tweak", {"type": 'EVT_TWEAK_L', "value": 'ANY', "any": True}, None),
+ ("gizmogroup.gizmo_tweak",
+ {"type": 'LEFTMOUSE', "value": 'CLICK', **any_except("alt")}, None),
+ ("gizmogroup.gizmo_tweak",
+ {"type": 'EVT_TWEAK_L', "value": 'ANY', **any_except("alt")}, None),
]
def _template_items_gizmo_tweak_value_drag():
return [
- ("gizmogroup.gizmo_tweak", {"type": 'EVT_TWEAK_L', "value": 'ANY', "any": True}, None),
+ ("gizmogroup.gizmo_tweak", {"type": 'EVT_TWEAK_L', "value": 'ANY', **any_except("alt")}, None),
]
@@ -2112,16 +2155,20 @@ def km_file_browser_main(params):
{"items": items},
)
+ if not params.use_file_single_click:
+ items.extend([
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
+ {"properties": [("open", True), ("deselect_all", not params.legacy)]}),
+ ])
+
items.extend([
("file.mouse_execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
# Both .execute and .select are needed here. The former only works if
# there's a file operator (i.e. not in regular editor mode) but is
# needed to load files. The latter makes selection work if there's no
# operator (i.e. in regular editor mode).
- ("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
- {"properties": [("open", True), ("deselect_all", not params.legacy)]}),
("file.select", {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties": [("open", False), ("deselect_all", not params.legacy)]}),
+ {"properties": [("open", params.use_file_single_click), ("deselect_all", not params.legacy)]}),
("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
{"properties": [("extend", True), ("open", False)]}),
("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
@@ -4365,7 +4412,6 @@ def km_object_mode(params):
("object.duplicates_make_real", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True}, None),
op_menu("VIEW3D_MT_make_single_user", {"type": 'U', "value": 'PRESS'}),
("object.convert", {"type": 'C', "value": 'PRESS', "alt": True}, None),
- ("object.proxy_make", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
("object.make_local", {"type": 'L', "value": 'PRESS'}, None),
("object.data_transfer", {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True}, None),
])
@@ -5639,6 +5685,9 @@ def km_knife_tool_modal_map(_params):
("IGNORE_SNAP_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None),
("IGNORE_SNAP_ON", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True}, None),
("IGNORE_SNAP_OFF", {"type": 'RIGHT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ("X_AXIS", {"type": 'X', "value": 'PRESS'}, None),
+ ("Y_AXIS", {"type": 'Y', "value": 'PRESS'}, None),
+ ("Z_AXIS", {"type": 'Z', "value": 'PRESS'}, None),
("ANGLE_SNAP_TOGGLE", {"type": 'A', "value": 'PRESS'}, None),
("CYCLE_ANGLE_SNAP_EDGE", {"type": 'R', "value": 'PRESS'}, None),
("CUT_THROUGH_TOGGLE", {"type": 'C', "value": 'PRESS'}, None),
@@ -6046,7 +6095,7 @@ def km_generic_tool_annotate_line(params):
"Generic Tool: Annotate Line",
{"space_type": 'EMPTY', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.annotate", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.annotate", params.tool_maybe_tweak_event,
{"properties": [("mode", 'DRAW_STRAIGHT'), ("wait_for_input", False)]}),
("gpencil.annotate", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True},
{"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
@@ -6096,7 +6145,8 @@ def km_image_editor_tool_uv_cursor(params):
{"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
{"items": [
("uv.cursor_set", {"type": params.tool_mouse, "value": 'PRESS'}, None),
- ("transform.translate", {"type": params.tool_tweak, "value": 'ANY'},
+ # Don't use `tool_maybe_tweak_event` since it conflicts with `PRESS` that places the cursor.
+ ("transform.translate", params.tool_tweak_event,
{"properties": [("release_confirm", True), ("cursor_transform", True)]}),
]},
)
@@ -6121,8 +6171,8 @@ def km_image_editor_tool_uv_select_box(params, *, fallback):
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple(
"uv.select_box",
- type=params.select_tweak if fallback else params.tool_tweak,
- value='ANY')),
+ # Don't use `tool_maybe_tweak_event`, see comment for this slot.
+ **({"type": params.select_tweak, "value": 'ANY'} if fallback else params.tool_tweak_event))),
*_template_uv_select_for_fallback(params, fallback),
]},
)
@@ -6151,9 +6201,7 @@ def km_image_editor_tool_uv_select_lasso(params, *, fallback):
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple(
"uv.select_lasso",
- type=params.select_tweak if fallback else params.tool_tweak,
- value='ANY')
- ),
+ **({"type": params.select_tweak, "value": 'ANY'} if fallback else params.tool_tweak_event))),
*_template_uv_select_for_fallback(params, fallback),
]},
)
@@ -6164,7 +6212,7 @@ def km_image_editor_tool_uv_rip_region(params):
"Image Editor Tool: Uv, Rip Region",
{"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
{"items": [
- ("uv.rip_move", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("uv.rip_move", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("TRANSFORM_OT_translate", [("release_confirm", True)])]}),
]},
)
@@ -6194,7 +6242,7 @@ def km_image_editor_tool_uv_move(params):
"Image Editor Tool: Uv, Move",
{"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
{"items": [
- ("transform.translate", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.translate", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6205,7 +6253,7 @@ def km_image_editor_tool_uv_rotate(params):
"Image Editor Tool: Uv, Rotate",
{"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
{"items": [
- ("transform.rotate", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.rotate", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6216,7 +6264,7 @@ def km_image_editor_tool_uv_scale(params):
"Image Editor Tool: Uv, Scale",
{"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
{"items": [
- ("transform.resize", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.resize", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6241,7 +6289,8 @@ def km_node_editor_tool_select_box(params, *, fallback):
{"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple(
- "node.select_box", type=params.tool_tweak, value='ANY',
+ "node.select_box",
+ type=params.tool_maybe_tweak, value=params.tool_maybe_tweak_value,
properties=[("tweak", True)],
)),
]},
@@ -6288,7 +6337,8 @@ def km_3d_view_tool_cursor(params):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
("view3d.cursor3d", {"type": params.tool_mouse, "value": 'PRESS'}, None),
- ("transform.translate", {"type": params.tool_tweak, "value": 'ANY'},
+ # Don't use `tool_maybe_tweak_event` since it conflicts with `PRESS` that places the cursor.
+ ("transform.translate", params.tool_tweak_event,
{"properties": [("release_confirm", True), ("cursor_transform", True)]}),
]},
)
@@ -6314,8 +6364,8 @@ def km_3d_view_tool_select_box(params, *, fallback):
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions(
"view3d.select_box",
- type=params.select_tweak if fallback else params.tool_tweak,
- value='ANY')),
+ # Don't use `tool_maybe_tweak_event`, see comment for this slot.
+ **({"type": params.select_tweak, "value": 'ANY'} if fallback else params.tool_tweak_event))),
*_template_view3d_select_for_fallback(params, fallback),
]},
)
@@ -6345,8 +6395,7 @@ def km_3d_view_tool_select_lasso(params, *, fallback):
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions(
"view3d.select_lasso",
- type=params.select_tweak if fallback else params.tool_tweak,
- value='ANY')),
+ **({"type": params.select_tweak, "value": 'ANY'} if fallback else params.tool_tweak_event))),
*_template_view3d_select_for_fallback(params, fallback),
]}
)
@@ -6357,8 +6406,7 @@ def km_3d_view_tool_transform(params):
"3D View Tool: Transform",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.from_gizmo",
- {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier}, None),
+ ("transform.from_gizmo", {**params.tool_maybe_tweak_event, **params.tool_modifier}, None),
]},
)
@@ -6368,8 +6416,7 @@ def km_3d_view_tool_move(params):
"3D View Tool: Move",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.translate",
- {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.translate", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6380,8 +6427,7 @@ def km_3d_view_tool_rotate(params):
"3D View Tool: Rotate",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.rotate",
- {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.rotate", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6392,14 +6438,14 @@ def km_3d_view_tool_scale(params):
"3D View Tool: Scale",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.resize",
- {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.resize", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
def km_3d_view_tool_shear(params):
+ # Don't use 'tool_maybe_tweak_value' since we would loose tweak direction support.
return (
"3D View Tool: Shear",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
@@ -6424,7 +6470,7 @@ def km_3d_view_tool_measure(params):
"3D View Tool: Measure",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("view3d.ruler_add", {"type": params.tool_tweak, "value": 'ANY'}, None),
+ ("view3d.ruler_add", params.tool_maybe_tweak_event, None),
("view3d.ruler_remove", {"type": 'X', "value": 'PRESS'}, None),
("view3d.ruler_remove", {"type": 'DEL', "value": 'PRESS'}, None),
]},
@@ -6436,7 +6482,7 @@ def km_3d_view_tool_pose_breakdowner(params):
"3D View Tool: Pose, Breakdowner",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("pose.breakdown", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier}, None),
+ ("pose.breakdown", {**params.tool_maybe_tweak_event, **params.tool_modifier}, None),
]},
)
@@ -6446,8 +6492,7 @@ def km_3d_view_tool_pose_push(params):
"3D View Tool: Pose, Push",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("pose.push",
- {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier}, None),
+ ("pose.push", {**params.tool_maybe_tweak_event, **params.tool_modifier}, None),
]},
)
@@ -6457,8 +6502,7 @@ def km_3d_view_tool_pose_relax(params):
"3D View Tool: Pose, Relax",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("pose.relax",
- {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier}, None),
+ ("pose.relax", {**params.tool_maybe_tweak_event, **params.tool_modifier}, None),
]},
)
@@ -6468,8 +6512,7 @@ def km_3d_view_tool_edit_armature_roll(params):
"3D View Tool: Edit Armature, Roll",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.transform",
- {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.transform", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True), ("mode", 'BONE_ROLL')]}),
]},
)
@@ -6480,7 +6523,7 @@ def km_3d_view_tool_edit_armature_bone_size(params):
"3D View Tool: Edit Armature, Bone Size",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.transform", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.transform", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True), ("mode", 'BONE_ENVELOPE')]}),
]},
)
@@ -6492,7 +6535,7 @@ def km_3d_view_tool_edit_armature_bone_envelope(params):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.bbone_resize", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.bbone_resize", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6503,7 +6546,7 @@ def km_3d_view_tool_edit_armature_extrude(params):
"3D View Tool: Edit Armature, Extrude",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("armature.extrude_move", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("armature.extrude_move", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("TRANSFORM_OT_translate", [("release_confirm", True)])]}),
]},
)
@@ -6524,7 +6567,12 @@ def km_3d_view_tool_interactive_add(params):
"3D View Tool: Object, Add Primitive",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("view3d.interactive_add", {"type": params.tool_tweak, "value": 'ANY', "any": True},
+ ("view3d.interactive_add",
+ {**params.tool_maybe_tweak_event,
+ # While "Alt" isn't an important shortcut to support,
+ # when the preferences to activate tools when "Alt" is held is used,
+ # it's illogical not to support holding "Alt", even though it is not required.
+ **({"any": True} if "alt" in params.tool_modifier else any_except("alt"))},
{"properties": [("wait_for_input", False)]}),
]},
)
@@ -6535,7 +6583,7 @@ def km_3d_view_tool_edit_mesh_extrude_region(params):
"3D View Tool: Edit Mesh, Extrude Region",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.extrude_context_move", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.extrude_context_move", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("TRANSFORM_OT_translate", [("release_confirm", True)])]}),
]},
)
@@ -6546,7 +6594,7 @@ def km_3d_view_tool_edit_mesh_extrude_manifold(params):
"3D View Tool: Edit Mesh, Extrude Manifold",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.extrude_manifold", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.extrude_manifold", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [
("MESH_OT_extrude_region", [("use_dissolve_ortho_edges", True)]),
("TRANSFORM_OT_translate", [
@@ -6565,7 +6613,7 @@ def km_3d_view_tool_edit_mesh_extrude_along_normals(params):
"3D View Tool: Edit Mesh, Extrude Along Normals",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.extrude_region_shrink_fatten", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.extrude_region_shrink_fatten", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("TRANSFORM_OT_shrink_fatten", [("release_confirm", True)])]}),
]},
)
@@ -6576,7 +6624,7 @@ def km_3d_view_tool_edit_mesh_extrude_individual(params):
"3D View Tool: Edit Mesh, Extrude Individual",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.extrude_faces_move", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.extrude_faces_move", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("TRANSFORM_OT_shrink_fatten", [("release_confirm", True)])]}),
]},
)
@@ -6598,7 +6646,7 @@ def km_3d_view_tool_edit_mesh_inset_faces(params):
"3D View Tool: Edit Mesh, Inset Faces",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.inset", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.inset", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6609,7 +6657,7 @@ def km_3d_view_tool_edit_mesh_bevel(params):
"3D View Tool: Edit Mesh, Bevel",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.bevel", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.bevel", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6656,7 +6704,7 @@ def km_3d_view_tool_edit_mesh_bisect(params):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
# No need for `tool_modifier` since this takes all input.
- ("mesh.bisect", {"type": params.tool_tweak, "value": 'ANY'}, None),
+ ("mesh.bisect", params.tool_maybe_tweak_event, None),
]},
)
@@ -6681,7 +6729,7 @@ def km_3d_view_tool_edit_mesh_spin(params):
"3D View Tool: Edit Mesh, Spin",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.spin", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier}, None),
+ ("mesh.spin", {**params.tool_maybe_tweak_event, **params.tool_modifier}, None),
]},
)
@@ -6691,7 +6739,7 @@ def km_3d_view_tool_edit_mesh_spin_duplicate(params):
"3D View Tool: Edit Mesh, Spin Duplicates",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.spin", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.spin", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("dupli", True)]}),
]},
)
@@ -6702,7 +6750,7 @@ def km_3d_view_tool_edit_mesh_smooth(params):
"3D View Tool: Edit Mesh, Smooth",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.vertices_smooth", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.vertices_smooth", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("wait_for_input", False)]}),
]},
)
@@ -6713,7 +6761,7 @@ def km_3d_view_tool_edit_mesh_randomize(params):
"3D View Tool: Edit Mesh, Randomize",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.vertex_random", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.vertex_random", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("wait_for_input", False)]}),
]},
)
@@ -6724,7 +6772,7 @@ def km_3d_view_tool_edit_mesh_edge_slide(params):
"3D View Tool: Edit Mesh, Edge Slide",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.edge_slide", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.edge_slide", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6735,7 +6783,7 @@ def km_3d_view_tool_edit_mesh_vertex_slide(params):
"3D View Tool: Edit Mesh, Vertex Slide",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.vert_slide", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.vert_slide", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6746,7 +6794,7 @@ def km_3d_view_tool_edit_mesh_shrink_fatten(params):
"3D View Tool: Edit Mesh, Shrink/Fatten",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.shrink_fatten", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.shrink_fatten", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6757,7 +6805,7 @@ def km_3d_view_tool_edit_mesh_push_pull(params):
"3D View Tool: Edit Mesh, Push/Pull",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.push_pull", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.push_pull", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6768,7 +6816,7 @@ def km_3d_view_tool_edit_mesh_to_sphere(params):
"3D View Tool: Edit Mesh, To Sphere",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.tosphere", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.tosphere", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6779,7 +6827,7 @@ def km_3d_view_tool_edit_mesh_rip_region(params):
"3D View Tool: Edit Mesh, Rip Region",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.rip_move", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.rip_move", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("TRANSFORM_OT_translate", [("release_confirm", True)])]}),
]},
)
@@ -6790,7 +6838,7 @@ def km_3d_view_tool_edit_mesh_rip_edge(params):
"3D View Tool: Edit Mesh, Rip Edge",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.rip_edge_move", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("mesh.rip_edge_move", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("TRANSFORM_OT_translate", [("release_confirm", True)])]}),
]},
)
@@ -6813,7 +6861,7 @@ def km_3d_view_tool_edit_curve_tilt(params):
"3D View Tool: Edit Curve, Tilt",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.tilt", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.tilt", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("release_confirm", True)]}),
]},
)
@@ -6824,7 +6872,7 @@ def km_3d_view_tool_edit_curve_radius(params):
"3D View Tool: Edit Curve, Radius",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.transform", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.transform", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("mode", 'CURVE_SHRINKFATTEN'), ("release_confirm", True)]}),
]},
)
@@ -6835,7 +6883,7 @@ def km_3d_view_tool_edit_curve_randomize(params):
"3D View Tool: Edit Curve, Randomize",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.vertex_random", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("transform.vertex_random", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("wait_for_input", False)]}),
]},
)
@@ -6846,7 +6894,7 @@ def km_3d_view_tool_edit_curve_extrude(params):
"3D View Tool: Edit Curve, Extrude",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("curve.extrude_move", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier},
+ ("curve.extrude_move", {**params.tool_maybe_tweak_event, **params.tool_modifier},
{"properties": [("TRANSFORM_OT_translate", [("release_confirm", True)])]}),
]},
)
@@ -6868,9 +6916,9 @@ def km_3d_view_tool_sculpt_box_hide(params):
"3D View Tool: Sculpt, Box Hide",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("paint.hide_show", {"type": params.tool_tweak, "value": 'ANY'},
+ ("paint.hide_show", params.tool_maybe_tweak_event,
{"properties": [("action", 'HIDE')]}),
- ("paint.hide_show", {"type": params.tool_tweak, "value": 'ANY', "ctrl": True},
+ ("paint.hide_show", {**params.tool_maybe_tweak_event, "ctrl": True},
{"properties": [("action", 'SHOW')]}),
("paint.hide_show", {"type": params.select_mouse, "value": params.select_mouse_value},
{"properties": [("action", 'SHOW'), ("area", 'ALL')]}),
@@ -6883,9 +6931,9 @@ def km_3d_view_tool_sculpt_box_mask(params):
"3D View Tool: Sculpt, Box Mask",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("paint.mask_box_gesture", {"type": params.tool_tweak, "value": 'ANY'},
+ ("paint.mask_box_gesture", params.tool_maybe_tweak_event,
{"properties": [("value", 1.0)]}),
- ("paint.mask_box_gesture", {"type": params.tool_tweak, "value": 'ANY', "ctrl": True},
+ ("paint.mask_box_gesture", {**params.tool_maybe_tweak_event, "ctrl": True},
{"properties": [("value", 0.0)]}),
]},
)
@@ -6896,9 +6944,9 @@ def km_3d_view_tool_sculpt_lasso_mask(params):
"3D View Tool: Sculpt, Lasso Mask",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("paint.mask_lasso_gesture", {"type": params.tool_tweak, "value": 'ANY'},
+ ("paint.mask_lasso_gesture", params.tool_maybe_tweak_event,
{"properties": [("value", 1.0)]}),
- ("paint.mask_lasso_gesture", {"type": params.tool_tweak, "value": 'ANY', "ctrl": True},
+ ("paint.mask_lasso_gesture", {**params.tool_maybe_tweak_event, "ctrl": True},
{"properties": [("value", 0.0)]}),
]},
)
@@ -6909,8 +6957,7 @@ def km_3d_view_tool_sculpt_box_face_set(params):
"3D View Tool: Sculpt, Box Face Set",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.face_set_box_gesture", {"type": params.tool_tweak, "value": 'ANY'},
- None),
+ ("sculpt.face_set_box_gesture", params.tool_maybe_tweak_event, None),
]},
)
@@ -6920,8 +6967,7 @@ def km_3d_view_tool_sculpt_lasso_face_set(params):
"3D View Tool: Sculpt, Lasso Face Set",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.face_set_lasso_gesture", {"type": params.tool_tweak, "value": 'ANY'},
- None),
+ ("sculpt.face_set_lasso_gesture", params.tool_maybe_tweak_event, None),
]},
)
@@ -6931,8 +6977,7 @@ def km_3d_view_tool_sculpt_box_trim(params):
"3D View Tool: Sculpt, Box Trim",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.trim_box_gesture", {"type": params.tool_tweak, "value": 'ANY'},
- None),
+ ("sculpt.trim_box_gesture", params.tool_maybe_tweak_event, None),
]},
)
@@ -6942,8 +6987,7 @@ def km_3d_view_tool_sculpt_lasso_trim(params):
"3D View Tool: Sculpt, Lasso Trim",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.trim_lasso_gesture", {"type": params.tool_tweak, "value": 'ANY'},
- None),
+ ("sculpt.trim_lasso_gesture", params.tool_maybe_tweak_event, None),
]},
)
@@ -6953,9 +6997,9 @@ def km_3d_view_tool_sculpt_line_mask(params):
"3D View Tool: Sculpt, Line Mask",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("paint.mask_line_gesture", {"type": params.tool_tweak, "value": 'ANY'},
+ ("paint.mask_line_gesture", params.tool_maybe_tweak_event,
{"properties": [("value", 1.0)]}),
- ("paint.mask_line_gesture", {"type": params.tool_tweak, "value": 'ANY', "ctrl": True},
+ ("paint.mask_line_gesture", {**params.tool_maybe_tweak_event, "ctrl": True},
{"properties": [("value", 0.0)]}),
]},
)
@@ -6966,8 +7010,7 @@ def km_3d_view_tool_sculpt_line_project(params):
"3D View Tool: Sculpt, Line Project",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.project_line_gesture", {"type": params.tool_tweak, "value": 'ANY'},
- None),
+ ("sculpt.project_line_gesture", params.tool_maybe_tweak_event, None),
]},
)
@@ -6977,8 +7020,7 @@ def km_3d_view_tool_sculpt_mesh_filter(params):
"3D View Tool: Sculpt, Mesh Filter",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.mesh_filter", {"type": params.tool_tweak, "value": 'ANY'},
- None)
+ ("sculpt.mesh_filter", params.tool_maybe_tweak_event, None)
]},
)
@@ -6988,8 +7030,7 @@ def km_3d_view_tool_sculpt_cloth_filter(params):
"3D View Tool: Sculpt, Cloth Filter",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.cloth_filter", {"type": params.tool_tweak, "value": 'ANY'},
- None)
+ ("sculpt.cloth_filter", params.tool_maybe_tweak_event, None)
]},
)
@@ -6999,8 +7040,7 @@ def km_3d_view_tool_sculpt_color_filter(params):
"3D View Tool: Sculpt, Color Filter",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.color_filter", {"type": params.tool_tweak, "value": 'ANY'},
- None)
+ ("sculpt.color_filter", params.tool_maybe_tweak_event, None)
]},
)
@@ -7010,10 +7050,8 @@ def km_3d_view_tool_sculpt_mask_by_color(params):
"3D View Tool: Sculpt, Mask by Color",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.mask_by_color", {"type": params.tool_mouse, "value": 'ANY'},
- None),
- ("sculpt.mask_by_color", {"type": params.tool_tweak, "value": 'ANY'},
- None),
+ ("sculpt.mask_by_color", {"type": params.tool_mouse, "value": 'ANY'}, None),
+ ("sculpt.mask_by_color", params.tool_tweak_event, None),
]},
)
@@ -7023,8 +7061,7 @@ def km_3d_view_tool_sculpt_face_set_edit(params):
"3D View Tool: Sculpt, Face Set Edit",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("sculpt.face_set_edit", {"type": params.tool_mouse, "value": 'PRESS'},
- None),
+ ("sculpt.face_set_edit", {"type": params.tool_mouse, "value": 'PRESS'}, None),
]},
)
@@ -7054,7 +7091,7 @@ def km_3d_view_tool_paint_weight_gradient(params):
"3D View Tool: Paint Weight, Gradient",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("paint.weight_gradient", {"type": params.tool_tweak, "value": 'ANY'}, None),
+ ("paint.weight_gradient", params.tool_maybe_tweak_event, None),
]},
)
@@ -7064,7 +7101,7 @@ def km_3d_view_tool_paint_gpencil_line(params):
"3D View Tool: Paint Gpencil, Line",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.primitive_line", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.primitive_line", params.tool_maybe_tweak_event,
{"properties": [("wait_for_input", False)]}),
("gpencil.primitive_line", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
{"properties": [("wait_for_input", False)]}),
@@ -7081,7 +7118,7 @@ def km_3d_view_tool_paint_gpencil_polyline(params):
"3D View Tool: Paint Gpencil, Polyline",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.primitive_polyline", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.primitive_polyline", params.tool_maybe_tweak_event,
{"properties": [("wait_for_input", False)]}),
("gpencil.primitive_polyline", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
{"properties": [("wait_for_input", False)]}),
@@ -7096,7 +7133,7 @@ def km_3d_view_tool_paint_gpencil_box(params):
"3D View Tool: Paint Gpencil, Box",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.primitive_box", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.primitive_box", params.tool_maybe_tweak_event,
{"properties": [("wait_for_input", False)]}),
("gpencil.primitive_box", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
{"properties": [("wait_for_input", False)]}),
@@ -7113,7 +7150,7 @@ def km_3d_view_tool_paint_gpencil_circle(params):
"3D View Tool: Paint Gpencil, Circle",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.primitive_circle", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.primitive_circle", params.tool_maybe_tweak_event,
{"properties": [("wait_for_input", False)]}),
("gpencil.primitive_circle", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
{"properties": [("wait_for_input", False)]}),
@@ -7130,7 +7167,7 @@ def km_3d_view_tool_paint_gpencil_arc(params):
"3D View Tool: Paint Gpencil, Arc",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.primitive_curve", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.primitive_curve", params.tool_maybe_tweak_event,
{"properties": [("type", 'ARC'), ("wait_for_input", False)]}),
("gpencil.primitive_curve", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
{"properties": [("type", 'ARC'), ("wait_for_input", False)]}),
@@ -7147,7 +7184,7 @@ def km_3d_view_tool_paint_gpencil_curve(params):
"3D View Tool: Paint Gpencil, Curve",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.primitive_curve", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.primitive_curve", params.tool_maybe_tweak_event,
{"properties": [("type", 'CURVE'), ("wait_for_input", False)]}),
# Lasso select
("gpencil.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True, "alt": True}, None),
@@ -7187,7 +7224,7 @@ def km_3d_view_tool_paint_gpencil_interpolate(params):
"3D View Tool: Paint Gpencil, Interpolate",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.interpolate", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.interpolate", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
@@ -7212,7 +7249,9 @@ def km_3d_view_tool_edit_gpencil_select_box(params, *, fallback):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions(
- "gpencil.select_box", type=params.select_tweak if fallback else params.tool_tweak, value='ANY')),
+ "gpencil.select_box",
+ # Don't use `tool_maybe_tweak_event`, see comment for this slot.
+ **({"type": params.select_tweak, "value": 'ANY'} if fallback else params.tool_tweak_event))),
*_template_view3d_gpencil_select_for_fallback(params, fallback),
]},
)
@@ -7242,8 +7281,7 @@ def km_3d_view_tool_edit_gpencil_select_lasso(params, *, fallback):
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions(
"gpencil.select_lasso",
- type=params.select_tweak if fallback else params.tool_tweak,
- value='ANY')),
+ **({"type": params.select_tweak, "value": 'ANY'} if fallback else params.tool_tweak_event))),
*_template_view3d_gpencil_select_for_fallback(params, fallback),
]}
)
@@ -7254,7 +7292,7 @@ def km_3d_view_tool_edit_gpencil_extrude(params):
"3D View Tool: Edit Gpencil, Extrude",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.extrude_move", {"type": params.tool_tweak, "value": 'ANY', **params.tool_modifier}, None),
+ ("gpencil.extrude_move", {**params.tool_maybe_tweak_event, **params.tool_modifier}, None),
]},
)
@@ -7265,7 +7303,7 @@ def km_3d_view_tool_edit_gpencil_radius(params):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
# No need for `tool_modifier` since this takes all input.
- ("transform.transform", {"type": params.tool_tweak, "value": 'ANY'},
+ ("transform.transform", params.tool_maybe_tweak_event,
{"properties": [("mode", 'GPENCIL_SHRINKFATTEN'), ("release_confirm", True)]}),
]},
)
@@ -7277,7 +7315,7 @@ def km_3d_view_tool_edit_gpencil_bend(params):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
# No need for `tool_modifier` since this takes all input.
- ("transform.bend", {"type": params.tool_tweak, "value": 'ANY'},
+ ("transform.bend", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
@@ -7289,7 +7327,7 @@ def km_3d_view_tool_edit_gpencil_shear(params):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
# No need for `tool_modifier` since this takes all input.
- ("transform.shear", {"type": params.tool_tweak, "value": 'ANY'},
+ ("transform.shear", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
@@ -7301,7 +7339,7 @@ def km_3d_view_tool_edit_gpencil_to_sphere(params):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
# No need for `tool_modifier` since this takes all input.
- ("transform.tosphere", {"type": params.tool_tweak, "value": 'ANY'},
+ ("transform.tosphere", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
@@ -7313,7 +7351,7 @@ def km_3d_view_tool_edit_gpencil_transform_fill(params):
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
# No need for `tool_modifier` since this takes all input.
- ("gpencil.transform_fill", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.transform_fill", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
@@ -7324,7 +7362,7 @@ def km_3d_view_tool_edit_gpencil_interpolate(params):
"3D View Tool: Edit Gpencil, Interpolate",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("gpencil.interpolate", {"type": params.tool_tweak, "value": 'ANY'},
+ ("gpencil.interpolate", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
@@ -7342,7 +7380,7 @@ def km_3d_view_tool_sculpt_gpencil_select_box(params):
return (
"3D View Tool: Sculpt Gpencil, Select Box",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items": _template_items_tool_select_actions("gpencil.select_box", type=params.tool_tweak, value='ANY')},
+ {"items": _template_items_tool_select_actions("gpencil.select_box", **params.tool_tweak_event)},
)
@@ -7361,7 +7399,7 @@ def km_3d_view_tool_sculpt_gpencil_select_lasso(params):
return (
"3D View Tool: Sculpt Gpencil, Select Lasso",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items": _template_items_tool_select_actions("gpencil.select_lasso", type=params.tool_tweak, value='ANY')},
+ {"items": _template_items_tool_select_actions("gpencil.select_lasso", **params.tool_tweak_event)},
)
@@ -7383,8 +7421,9 @@ def km_sequencer_editor_tool_select_box(params, *, fallback):
_fallback_id("Sequencer Tool: Select Box", fallback),
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
{"items": [
+ # Don't use `tool_maybe_tweak_event`, see comment for this slot.
*_template_items_tool_select_actions_simple(
- "sequencer.select_box", type=params.tool_tweak, value='ANY',
+ "sequencer.select_box", **params.tool_tweak_event,
properties=[("tweak", params.select_mouse == 'LEFTMOUSE')],
),
# RMB select can already set the frame, match the tweak tool.
@@ -7425,7 +7464,7 @@ def km_sequencer_editor_tool_move(params):
"Sequencer Tool: Move",
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
{"items": [
- ("transform.translate", {"type": params.tool_tweak, "value": 'ANY'},
+ ("transform.translate", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
@@ -7436,7 +7475,7 @@ def km_sequencer_editor_tool_rotate(params):
"Sequencer Tool: Rotate",
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
{"items": [
- ("transform.rotate", {"type": params.tool_tweak, "value": 'ANY'},
+ ("transform.rotate", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
@@ -7447,7 +7486,7 @@ def km_sequencer_editor_tool_scale(params):
"Sequencer Tool: Scale",
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
{"items": [
- ("transform.resize", {"type": params.tool_tweak, "value": 'ANY'},
+ ("transform.resize", params.tool_maybe_tweak_event,
{"properties": [("release_confirm", True)]}),
]},
)
diff --git a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
index 6a24f072ed0..886abae3602 100644
--- a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
+++ b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
@@ -3876,6 +3876,9 @@ def km_knife_tool_modal_map(_params):
("IGNORE_SNAP_OFF", {"type": 'LEFT_SHIFT', "value": 'RELEASE', "any": True}, None),
("IGNORE_SNAP_ON", {"type": 'RIGHT_SHIFT', "value": 'PRESS', "any": True}, None),
("IGNORE_SNAP_OFF", {"type": 'RIGHT_SHIFT', "value": 'RELEASE', "any": True}, None),
+ ("X_AXIS", {"type": 'X', "value": 'PRESS'}, None),
+ ("Y_AXIS", {"type": 'Y', "value": 'PRESS'}, None),
+ ("Z_AXIS", {"type": 'Z', "value": 'PRESS'}, None),
("ANGLE_SNAP_TOGGLE", {"type": 'A', "value": 'PRESS'}, None),
("CYCLE_ANGLE_SNAP_EDGE", {"type": 'R', "value": 'PRESS'}, None),
("CUT_THROUGH_TOGGLE", {"type": 'C', "value": 'PRESS'}, None),
diff --git a/release/scripts/startup/bl_app_templates_system/2D_Animation/__init__.py b/release/scripts/startup/bl_app_templates_system/2D_Animation/__init__.py
index c8328f5ee42..f8b504b2e34 100644
--- a/release/scripts/startup/bl_app_templates_system/2D_Animation/__init__.py
+++ b/release/scripts/startup/bl_app_templates_system/2D_Animation/__init__.py
@@ -54,11 +54,26 @@ def update_factory_startup_grease_pencils():
gpd.onion_keyframe_type = 'ALL'
+def update_factory_startup_theme():
+ # To prevent saving over the current theme Preferences,
+ # store the current state of use_preferences_save to use later.
+ preferences = bpy.context.preferences
+ save_preferences_state = preferences.use_preferences_save
+
+ # Turn use_preferences_save off and set header background alpha.
+ preferences.use_preferences_save = False
+ preferences.themes['Default'].view_3d.space.header[3] = 0.8
+
+ # Restore the original use_preferences_save status.
+ preferences.use_preferences_save = save_preferences_state
+
+
@persistent
def load_handler(_):
update_factory_startup_screens()
update_factory_startup_scenes()
update_factory_startup_grease_pencils()
+ update_factory_startup_theme()
def register():
diff --git a/release/scripts/startup/bl_operators/assets.py b/release/scripts/startup/bl_operators/assets.py
index b241e537c38..de46e5c85fb 100644
--- a/release/scripts/startup/bl_operators/assets.py
+++ b/release/scripts/startup/bl_operators/assets.py
@@ -27,17 +27,28 @@ from bpy_extras.asset_utils import (
)
-class ASSET_OT_tag_add(Operator):
+class AssetBrowserMetadataOperator:
+ @classmethod
+ def poll(cls, context):
+ if not SpaceAssetInfo.is_asset_browser_poll(context) or not context.asset_file_handle:
+ return False
+
+ if not context.asset_file_handle.local_id:
+ Operator.poll_message_set(
+ "Asset metadata from external asset libraries can't be "
+ "edited, only assets stored in the current file can"
+ )
+ return False
+ return True
+
+
+class ASSET_OT_tag_add(AssetBrowserMetadataOperator, Operator):
"""Add a new keyword tag to the active asset"""
bl_idname = "asset.tag_add"
bl_label = "Add Asset Tag"
bl_options = {'REGISTER', 'UNDO'}
- @classmethod
- def poll(cls, context):
- return SpaceAssetInfo.is_asset_browser_poll(context) and SpaceAssetInfo.get_active_asset(context)
-
def execute(self, context):
active_asset = SpaceAssetInfo.get_active_asset(context)
active_asset.tags.new("Unnamed Tag")
@@ -45,7 +56,7 @@ class ASSET_OT_tag_add(Operator):
return {'FINISHED'}
-class ASSET_OT_tag_remove(Operator):
+class ASSET_OT_tag_remove(AssetBrowserMetadataOperator, Operator):
"""Remove an existing keyword tag from the active asset"""
bl_idname = "asset.tag_remove"
@@ -54,21 +65,20 @@ class ASSET_OT_tag_remove(Operator):
@classmethod
def poll(cls, context):
- if not SpaceAssetInfo.is_asset_browser_poll(context):
+ if not super().poll(context):
return False
- active_asset = SpaceAssetInfo.get_active_asset(context)
- if not active_asset:
- return False
-
- return active_asset.active_tag in range(len(active_asset.tags))
+ active_asset_file = context.asset_file_handle
+ asset_metadata = active_asset_file.asset_data
+ return asset_metadata.active_tag in range(len(asset_metadata.tags))
def execute(self, context):
- active_asset = SpaceAssetInfo.get_active_asset(context)
- tag = active_asset.tags[active_asset.active_tag]
+ active_asset_file = context.asset_file_handle
+ asset_metadata = active_asset_file.asset_data
+ tag = asset_metadata.tags[asset_metadata.active_tag]
- active_asset.tags.remove(tag)
- active_asset.active_tag -= 1
+ asset_metadata.tags.remove(tag)
+ asset_metadata.active_tag -= 1
return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index ebf80ca9ee4..6bf45cc5a15 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -23,6 +23,7 @@ import bpy
from bpy.types import (
Menu,
Operator,
+ bpy_prop_array,
)
from bpy.props import (
BoolProperty,
@@ -31,6 +32,8 @@ from bpy.props import (
FloatProperty,
IntProperty,
StringProperty,
+ IntVectorProperty,
+ FloatVectorProperty,
)
from bpy.app.translations import pgettext_iface as iface_
@@ -1266,48 +1269,20 @@ rna_path = StringProperty(
options={'HIDDEN'},
)
-rna_value = StringProperty(
- name="Property Value",
- description="Property value edit",
- maxlen=1024,
-)
-
-rna_default = StringProperty(
- name="Default Value",
- description="Default value of the property. Important for NLA mixing",
- maxlen=1024,
-)
-
-rna_custom_property = StringProperty(
+rna_custom_property_name = StringProperty(
name="Property Name",
description="Property name edit",
# Match `MAX_IDPROP_NAME - 1` in Blender's source.
maxlen=63,
)
-rna_min = FloatProperty(
- name="Min",
- description="Minimum value of the property",
- default=-10000.0,
- precision=3,
-)
-
-rna_max = FloatProperty(
- name="Max",
- description="Maximum value of the property",
- default=10000.0,
- precision=3,
-)
-
-rna_use_soft_limits = BoolProperty(
- name="Use Soft Limits",
- description="Limits the Property Value slider to a range, values outside the range must be inputted numerically",
-)
-
-rna_is_overridable_library = BoolProperty(
- name="Is Library Overridable",
- description="Allow the property to be overridden when the data-block is linked",
- default=False,
+rna_custom_property_type_items = (
+ ('FLOAT', "Float", "A single floating-point value"),
+ ('FLOAT_ARRAY', "Float Array", "An array of floating-point values"),
+ ('INT', "Integer", "A single integer"),
+ ('INT_ARRAY', "Integer Array", "An array of integers"),
+ ('STRING', "String", "A string value"),
+ ('PYTHON', "Python", "Edit a python value directly, for unsupported property types"),
)
# Most useful entries of rna_enum_property_subtype_items for number arrays:
@@ -1319,160 +1294,333 @@ rna_vector_subtype_items = (
('QUATERNION', "Quaternion Rotation", "Quaternion rotation (affects NLA blending)"),
)
-
class WM_OT_properties_edit(Operator):
- """Edit the attributes of the property"""
+ """Change a custom property's type, or adjust how it is displayed in the interface"""
bl_idname = "wm.properties_edit"
bl_label = "Edit Property"
# register only because invoke_props_popup requires.
bl_options = {'REGISTER', 'INTERNAL'}
+ # Common settings used for all property types. Generally, separate properties are used for each
+ # type to improve the experience when choosing UI data values.
+
data_path: rna_path
- property: rna_custom_property
- value: rna_value
- default: rna_default
- min: rna_min
- max: rna_max
- use_soft_limits: rna_use_soft_limits
- is_overridable_library: rna_is_overridable_library
- soft_min: rna_min
- soft_max: rna_max
+ property_name: rna_custom_property_name
+ property_type: EnumProperty(
+ name="Type",
+ items=lambda self, _context: WM_OT_properties_edit.type_items,
+ )
+ is_overridable_library: BoolProperty(
+ name="Is Library Overridable",
+ description="Allow the property to be overridden when the data-block is linked",
+ default=False,
+ )
description: StringProperty(
- name="Tooltip",
+ name="Description",
+ )
+
+ # Shared for integer and string properties.
+
+ use_soft_limits: BoolProperty(
+ name="Use Soft Limits",
+ description="Limits the Property Value slider to a range, values outside the range must be inputted numerically",
+ )
+ array_length: IntProperty(
+ name="Array Length",
+ default=3,
+ min=1,
+ max=32, # 32 is the maximum size for RNA array properties.
+ )
+
+ # Integer properties.
+
+ # This property stores values for both array and non-array properties.
+ default_int: IntVectorProperty(
+ name="Default Value",
+ size=32,
+ )
+ min_int: IntProperty(
+ name="Min",
+ default=-10000,
+ )
+ max_int: IntProperty(
+ name="Max",
+ default=10000,
+ )
+ soft_min_int: IntProperty(
+ name="Soft Min",
+ default=-10000,
+ )
+ soft_max_int: IntProperty(
+ name="Soft Max",
+ default=10000,
+ )
+ step_int: IntProperty(
+ name="Step",
+ min=1,
+ default=1,
+ )
+
+ # Float properties.
+
+ # This property stores values for both array and non-array properties.
+ default_float: FloatVectorProperty(
+ name="Default Value",
+ size=32,
+ )
+ min_float: FloatProperty(
+ name="Min",
+ default=-10000.0,
+ )
+ max_float: FloatProperty(
+ name="Max",
+ default=-10000.0,
+ )
+ soft_min_float: FloatProperty(
+ name="Soft Min",
+ default=-10000.0,
+ )
+ soft_max_float: FloatProperty(
+ name="Soft Max",
+ default=-10000.0,
+ )
+ precision: IntProperty(
+ name="Precision",
+ default=3,
+ min=0,
+ max=8,
+ )
+ step_float: FloatProperty(
+ name="Step",
+ default=0.1,
+ min=0.001,
)
subtype: EnumProperty(
name="Subtype",
items=lambda self, _context: WM_OT_properties_edit.subtype_items,
)
- subtype_items = rna_vector_subtype_items
-
- def _init_subtype(self, prop_type, is_array, subtype):
- subtype = subtype or 'NONE'
- subtype_items = rna_vector_subtype_items
+ # String properties.
- # Add a temporary enum entry to preserve unknown subtypes
- if not any(subtype == item[0] for item in subtype_items):
- subtype_items += ((subtype, subtype, ""),)
+ default_string: StringProperty(
+ name="Default Value",
+ maxlen=1024,
+ )
- WM_OT_properties_edit.subtype_items = subtype_items
- self.subtype = subtype
+ # Store the value converted to a string as a fallback for otherwise unsupported types.
+ eval_string: StringProperty(
+ name="Value",
+ description="Python value for unsupported custom property types"
+ )
- def _cmp_props_get(self):
- # Changing these properties will refresh the UI
- return {
- "use_soft_limits": self.use_soft_limits,
- "soft_range": (self.soft_min, self.soft_max),
- "hard_range": (self.min, self.max),
- }
+ type_items = rna_custom_property_type_items
+ subtype_items = rna_vector_subtype_items
- def get_value_eval(self):
- failed = False
- try:
- value_eval = eval(self.value)
- # assert else None -> None, not "None", see T33431.
- assert(type(value_eval) in {str, float, int, bool, tuple, list})
- except:
- failed = True
- value_eval = self.value
+ # Helper method to avoid repetative code to retrieve a single value from sequences and non-sequences.
+ @staticmethod
+ def _convert_new_value_single(old_value, new_type):
+ if hasattr(old_value, "__len__"):
+ return new_type(old_value[0])
+ return new_type(old_value)
- return value_eval, failed
+ # Helper method to create a list of a given value and type, using a sequence or non-sequence old value.
+ @staticmethod
+ def _convert_new_value_array(old_value, new_type, new_len):
+ if hasattr(old_value, "__len__"):
+ new_array = [new_type()] * new_len
+ for i in range(min(len(old_value), new_len)):
+ new_array[i] = new_type(old_value[i])
+ return new_array
+ return [new_type(old_value)] * new_len
+
+ # Convert an old property for a string, avoiding unhelpful string representations for custom list types.
+ @staticmethod
+ def _convert_old_property_to_string(item, name):
+ # The IDProperty group view API currently doesn't have a "lookup" method.
+ for key, value in item.items():
+ if key == name:
+ old_value = value
+ break
- def get_default_eval(self):
- failed = False
- try:
- default_eval = eval(self.default)
- # assert else None -> None, not "None", see T33431.
- assert(type(default_eval) in {str, float, int, bool, tuple, list})
- except:
- failed = True
- default_eval = self.default
+ # In order to get a better string conversion, convert the property to a builtin sequence type first.
+ to_dict = getattr(old_value, "to_dict", None)
+ to_list = getattr(old_value, "to_list", None)
+ if to_dict:
+ old_value = to_dict()
+ elif to_list:
+ old_value = to_list()
- return default_eval, failed
+ return str(old_value)
- def execute(self, context):
+ # Retrieve the current type of the custom property on the RNA struct. Some properties like group properties
+ # can be created in the UI, but editing their meta-data isn't supported. In that case, return 'PYTHON'.
+ def _get_property_type(self, item, property_name):
from rna_prop_ui import (
- rna_idprop_ui_prop_update,
rna_idprop_value_item_type,
)
- data_path = self.data_path
- prop = self.property
- prop_escape = bpy.utils.escape_identifier(prop)
-
- prop_old = getattr(self, "_last_prop", [None])[0]
+ prop_value = item[property_name]
- if prop_old is None:
- self.report({'ERROR'}, "Direct execution not supported")
- return {'CANCELLED'}
-
- value_eval, value_failed = self.get_value_eval()
- default_eval, default_failed = self.get_default_eval()
-
- # First remove
- item = eval("context.%s" % data_path)
-
- if (item.id_data and item.id_data.override_library and item.id_data.override_library.reference):
- self.report({'ERROR'}, "Cannot edit properties from override data")
- return {'CANCELLED'}
-
- prop_type_old = type(item[prop_old])
+ prop_type, is_array = rna_idprop_value_item_type(prop_value)
+ if prop_type == int:
+ if is_array:
+ return 'INT_ARRAY'
+ return 'INT'
+ elif prop_type == float:
+ if is_array:
+ return 'FLOAT_ARRAY'
+ return 'FLOAT'
+ elif prop_type == str:
+ if is_array:
+ return 'PYTHON'
+ return 'STRING'
- # Deleting the property will also remove the UI data.
- del item[prop_old]
+ return 'PYTHON'
- # Reassign
- item[prop] = value_eval
- item.property_overridable_library_set('["%s"]' % prop_escape, self.is_overridable_library)
- rna_idprop_ui_prop_update(item, prop)
+ def _init_subtype(self, subtype):
+ subtype = subtype or 'NONE'
+ subtype_items = rna_vector_subtype_items
- self._last_prop[:] = [prop]
+ # Add a temporary enum entry to preserve unknown subtypes
+ if not any(subtype == item[0] for item in subtype_items):
+ subtype_items += ((subtype, subtype, ""),)
- prop_value = item[prop]
- prop_type_new = type(prop_value)
- prop_type, is_array = rna_idprop_value_item_type(prop_value)
+ WM_OT_properties_edit.subtype_items = subtype_items
+ self.subtype = subtype
- if prop_type == int:
- ui_data = item.id_properties_ui(prop)
- if type(default_eval) == str:
- self.report({'WARNING'}, "Could not evaluate number from default value")
- default_eval = None
- elif hasattr(default_eval, "__len__"):
- default_eval = [int(round(value)) for value in default_eval]
+ # Fill the operator's properties with the UI data properties from the existing custom property.
+ # Note that if the UI data doesn't exist yet, the access will create it and use those default values.
+ def _fill_old_ui_data(self, item, name):
+ ui_data = item.id_properties_ui(name)
+ rna_data = ui_data.as_dict()
+
+ if self.property_type in {'FLOAT', 'FLOAT_ARRAY'}:
+ self.min_float = rna_data["min"]
+ self.max_float = rna_data["max"]
+ self.soft_min_float = rna_data["soft_min"]
+ self.soft_max_float = rna_data["soft_max"]
+ self.precision = rna_data["precision"]
+ self.step_float = rna_data["step"]
+ self.subtype = rna_data["subtype"]
+ self.use_soft_limits = (
+ self.min_float != self.soft_min_float or
+ self.max_float != self.soft_max_float
+ )
+ default = self._convert_new_value_array(rna_data["default"], float, 32)
+ self.default_float = default if isinstance(default, list) else [default] * 32
+ elif self.property_type in {'INT', 'INT_ARRAY'}:
+ self.min_int = rna_data["min"]
+ self.max_int = rna_data["max"]
+ self.soft_min_int = rna_data["soft_min"]
+ self.soft_max_int = rna_data["soft_max"]
+ self.step_int = rna_data["step"]
+ self.use_soft_limits = (
+ self.min_int != self.soft_min_int or
+ self.max_int != self.soft_max_int
+ )
+ self.default_int = self._convert_new_value_array(rna_data["default"], int, 32)
+ elif self.property_type == 'STRING':
+ self.default_string = rna_data["default"]
+
+ if self.property_type in { 'FLOAT_ARRAY', 'INT_ARRAY'}:
+ self.array_length = len(item[name])
+
+ # The dictionary does not contain the description if it was empty.
+ self.description = rna_data.get("description", "")
+
+ self._init_subtype(self.subtype)
+ escaped_name = bpy.utils.escape_identifier(name)
+ self.is_overridable_library = bool(item.is_property_overridable_library('["%s"]' % escaped_name))
+
+ # When the operator chooses a different type than the original property,
+ # attempt to convert the old value to the new type for continuity and speed.
+ def _get_converted_value(self, item, name_old, prop_type_new):
+ if prop_type_new == 'INT':
+ return self._convert_new_value_single(item[name_old], int)
+
+ if prop_type_new == 'FLOAT':
+ return self._convert_new_value_single(item[name_old], float)
+
+ if prop_type_new == 'INT_ARRAY':
+ prop_type_old = self._get_property_type(item, name_old)
+ if prop_type_old in {'INT', 'FLOAT', 'INT_ARRAY', 'FLOAT_ARRAY'}:
+ return self._convert_new_value_array(item[name_old], int, self.array_length)
+
+ if prop_type_new == 'FLOAT_ARRAY':
+ prop_type_old = self._get_property_type(item, name_old)
+ if prop_type_old in {'INT', 'FLOAT', 'FLOAT_ARRAY', 'INT_ARRAY'}:
+ return self._convert_new_value_array(item[name_old], float, self.array_length)
+
+ if prop_type_new == 'STRING':
+ return self._convert_old_property_to_string(item, name_old)
+
+ # If all else fails, create an empty string property. That should avoid errors later on anyway.
+ return ""
+
+ # Any time the target type is changed in the dialog, it's helpful to convert the UI data values
+ # to the new type as well, when possible, currently this only applies for floats and ints.
+ def _convert_old_ui_data_to_new_type(self, prop_type_old, prop_type_new):
+ if prop_type_new in {'INT', 'INT_ARRAY'} and prop_type_old in {'FLOAT', 'FLOAT_ARRAY'}:
+ self.min_int = int(self.min_float)
+ self.max_int = int(self.max_float)
+ self.soft_min_int = int(self.soft_min_float)
+ self.soft_max_int = int(self.soft_max_float)
+ self.default_int = self._convert_new_value_array(self.default_float, int, 32)
+ elif prop_type_new in {'FLOAT', 'FLOAT_ARRAY'} and prop_type_old in {'INT', 'INT_ARRAY'}:
+ self.min_float = float(self.min_int)
+ self.max_float = float(self.max_int)
+ self.soft_min_float = float(self.soft_min_int)
+ self.soft_max_float = float(self.soft_max_int)
+ self.default_float = self._convert_new_value_array(self.default_int, float, 32)
+ # Don't convert between string and float/int defaults here, it's not expected like the other conversions.
+
+ # Fill the property's UI data with the values chosen in the operator.
+ def _create_ui_data_for_new_prop(self, item, name, prop_type_new):
+ if prop_type_new in {'INT', 'INT_ARRAY'}:
+ ui_data = item.id_properties_ui(name)
ui_data.update(
- min=int(round(self.min)),
- max=int(round(self.max)),
- soft_min=int(round(self.soft_min)),
- soft_max=int(round(self.soft_max)),
- default=default_eval,
- subtype=self.subtype,
- description=self.description
+ min=self.min_int,
+ max=self.max_int,
+ soft_min=self.soft_min_int if self.use_soft_limits else self.min_int,
+ soft_max=self.soft_max_int if self.use_soft_limits else self.min_int,
+ step=self.step_int,
+ default=self.default_int[0] if prop_type_new == 'INT' else self.default_int[:self.array_length],
+ description=self.description,
)
- elif prop_type == float:
- ui_data = item.id_properties_ui(prop)
- if type(default_eval) == str:
- self.report({'WARNING'}, "Could not evaluate number from default value")
- default_eval = None
+ elif prop_type_new in {'FLOAT', 'FLOAT_ARRAY'}:
+ ui_data = item.id_properties_ui(name)
ui_data.update(
- min=self.min,
- max=self.max,
- soft_min=self.soft_min,
- soft_max=self.soft_max,
- default=default_eval,
+ min=self.min_float,
+ max=self.max_float,
+ soft_min=self.soft_min_float if self.use_soft_limits else self.min_float,
+ soft_max=self.soft_max_float if self.use_soft_limits else self.max_float,
+ step=self.step_float,
+ precision=self.precision,
+ default=self.default_float[0] if prop_type_new == 'FLOAT' else self.default_float[:self.array_length],
+ description=self.description,
subtype=self.subtype,
- description=self.description
)
- elif prop_type == str and not is_array and not default_failed: # String arrays do not support UI data.
- ui_data = item.id_properties_ui(prop)
+ elif prop_type_new == 'STRING':
+ ui_data = item.id_properties_ui(name)
ui_data.update(
- default=self.default,
- subtype=self.subtype,
- description=self.description
+ default=self.default_string,
+ description=self.description,
)
+ escaped_name = bpy.utils.escape_identifier(name)
+ item.property_overridable_library_set('["%s"]' % escaped_name, self.is_overridable_library)
+
+ def _update_blender_for_prop_change(self, context, item, name, prop_type_old, prop_type_new):
+ from rna_prop_ui import (
+ rna_idprop_ui_prop_update,
+ )
+
+ rna_idprop_ui_prop_update(item, name)
+
# If we have changed the type of the property, update its potential anim curves!
if prop_type_old != prop_type_new:
- data_path = '["%s"]' % prop_escape
+ escaped_name = bpy.utils.escape_identifier(name)
+ data_path = '["%s"]' % escaped_name
done = set()
def _update(fcurves):
@@ -1498,149 +1646,196 @@ class WM_OT_properties_edit(Operator):
for nt in adt.nla_tracks:
_update_strips(nt.strips)
- # Otherwise existing buttons which reference freed
- # memory may crash Blender T26510.
- # context.area.tag_redraw()
+ # Otherwise existing buttons which reference freed memory may crash Blender (T26510).
for win in context.window_manager.windows:
for area in win.screen.areas:
area.tag_redraw()
- return {'FINISHED'}
+ def execute(self, context):
+ name_old = getattr(self, "_old_prop_name", [None])[0]
+ if name_old is None:
+ self.report({'ERROR'}, "Direct execution not supported")
+ return {'CANCELLED'}
- def invoke(self, context, _event):
- from rna_prop_ui import (
- rna_idprop_value_to_python,
- rna_idprop_value_item_type
- )
+ data_path = self.data_path
+ name = self.property_name
- prop = self.property
- prop_escape = bpy.utils.escape_identifier(prop)
+ item = eval("context.%s" % data_path)
+ if (item.id_data and item.id_data.override_library and item.id_data.override_library.reference):
+ self.report({'ERROR'}, "Cannot edit properties from override data")
+ return {'CANCELLED'}
- data_path = self.data_path
+ prop_type_old = self._get_property_type(item, name_old)
+ prop_type_new = self.property_type
+ self._old_prop_name[:] = [name]
+
+ if prop_type_new == 'PYTHON':
+ try:
+ new_value = eval(self.eval_string)
+ except Exception as ex:
+ self.report({'WARNING'}, "Python evaluation failed: " + str(ex))
+ return {'CANCELLED'}
+ try:
+ item[name] = new_value
+ except Exception as ex:
+ self.report({'ERROR'}, "Failed to assign value: " + str(ex))
+ return {'CANCELLED'}
+ if name_old != name:
+ del item[name_old]
+ else:
+ new_value = self._get_converted_value(item, name_old, prop_type_new)
+ del item[name_old]
+ item[name] = new_value
+
+ self._create_ui_data_for_new_prop(item, name, prop_type_new)
+ self._update_blender_for_prop_change(context, item, name, prop_type_old, prop_type_new)
+
+ return {'FINISHED'}
+
+ def invoke(self, context, _event):
+ data_path = self.data_path
if not data_path:
self.report({'ERROR'}, "Data path not set")
return {'CANCELLED'}
- self._last_prop = [prop]
+ name = self.property_name
- item = eval("context.%s" % data_path)
+ self._old_prop_name = [name]
+ self.last_property_type = self.property_type
+ item = eval("context.%s" % data_path)
if (item.id_data and item.id_data.override_library and item.id_data.override_library.reference):
- self.report({'ERROR'}, "Cannot edit properties from override data")
+ self.report({'ERROR'}, "Properties from override data can not be edited")
return {'CANCELLED'}
- # retrieve overridable static
- is_overridable = item.is_property_overridable_library('["%s"]' % prop_escape)
- self.is_overridable_library = bool(is_overridable)
-
- # default default value
- value, value_failed = self.get_value_eval()
- prop_type, is_array = rna_idprop_value_item_type(value)
- if prop_type in {int, float}:
- self.default = str(prop_type(0))
- else:
- self.default = ""
-
- # setup defaults
- if prop_type in {int, float}:
- ui_data = item.id_properties_ui(prop)
- rna_data = ui_data.as_dict()
- self.subtype = rna_data["subtype"]
- self.min = rna_data["min"]
- self.max = rna_data["max"]
- self.soft_min = rna_data["soft_min"]
- self.soft_max = rna_data["soft_max"]
- self.use_soft_limits = (
- self.min != self.soft_min or
- self.max != self.soft_max
- )
- self.default = str(rna_data["default"])
- self.description = rna_data.get("description", "")
- elif prop_type == str and not is_array and not value_failed: # String arrays do not support UI data.
- ui_data = item.id_properties_ui(prop)
- rna_data = ui_data.as_dict()
- self.subtype = rna_data["subtype"]
- self.default = str(rna_data["default"])
- self.description = rna_data.get("description", "")
- else:
- self.min = self.soft_min = 0
- self.max = self.soft_max = 1
- self.use_soft_limits = False
- self.description = ""
+ # Set operator's property type with the type of the existing property, to display the right settings.
+ old_type = self._get_property_type(item, name)
+ self.property_type = old_type
- self._init_subtype(prop_type, is_array, self.subtype)
+ # So that the operator can do something for unsupported properties, change the property into
+ # a string, just for editing in the dialog. When the operator executes, it will be converted back
+ # into a python value. Always do this conversion, in case the Python property edit type is selected.
+ self.eval_string = self._convert_old_property_to_string(item, name)
- # store for comparison
- self._cmp_props = self._cmp_props_get()
+ if old_type != 'PYTHON':
+ self._fill_old_ui_data(item, name)
wm = context.window_manager
return wm.invoke_props_dialog(self)
- def check(self, _context):
- cmp_props = self._cmp_props_get()
+ def check(self, context):
changed = False
- if self._cmp_props != cmp_props:
- if cmp_props["use_soft_limits"]:
- if cmp_props["soft_range"] != self._cmp_props["soft_range"]:
- self.min = min(self.min, self.soft_min)
- self.max = max(self.max, self.soft_max)
+
+ # In order to convert UI data between types for type changes before the operator has actually executed,
+ # compare against the type the last time the check method was called (the last time a value was edited).
+ if self.property_type != self.last_property_type:
+ self._convert_old_ui_data_to_new_type(self.last_property_type, self.property_type)
+ changed = True
+
+ # Make sure that min is less than max, soft range is inside hard range, etc.
+ if self.property_type in {'FLOAT', 'FLOAT_ARRAY'}:
+ if self.min_float > self.max_float:
+ self.min_float, self.max_float = self.max_float, self.min_float
+ changed = True
+ if self.soft_min_float > self.soft_max_float:
+ self.soft_min_float, self.soft_max_float = self.soft_max_float, self.soft_min_float
+ changed = True
+ if self.use_soft_limits:
+ if self.soft_max_float > self.max_float:
+ self.soft_max_float = self.max_float
changed = True
- if cmp_props["hard_range"] != self._cmp_props["hard_range"]:
- self.soft_min = max(self.min, self.soft_min)
- self.soft_max = min(self.max, self.soft_max)
+ if self.soft_min_float < self.min_float:
+ self.soft_min_float = self.min_float
changed = True
- else:
- if cmp_props["soft_range"] != cmp_props["hard_range"]:
- self.soft_min = self.min
- self.soft_max = self.max
+ elif self.property_type in {'INT', 'INT_ARRAY'}:
+ if self.min_int > self.max_int:
+ self.min_int, self.max_int = self.max_int, self.min_int
+ changed = True
+ if self.soft_min_int > self.soft_max_int:
+ self.soft_min_int, self.soft_max_int = self.soft_max_int, self.soft_min_int
+ changed = True
+ if self.use_soft_limits:
+ if self.soft_max_int > self.max_int:
+ self.soft_max_int = self.max_int
+ changed = True
+ if self.soft_min_int < self.min_int:
+ self.soft_min_int = self.min_int
changed = True
- changed |= (cmp_props["use_soft_limits"] != self._cmp_props["use_soft_limits"])
-
- if changed:
- cmp_props = self._cmp_props_get()
-
- self._cmp_props = cmp_props
+ self.last_property_type = self.property_type
return changed
def draw(self, _context):
- from rna_prop_ui import (
- rna_idprop_value_item_type,
- )
-
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
- layout.prop(self, "property")
- layout.prop(self, "value")
+ layout.prop(self, "property_type")
+ layout.prop(self, "property_name")
- value, value_failed = self.get_value_eval()
- proptype, is_array = rna_idprop_value_item_type(value)
+ if self.property_type in {'FLOAT', 'FLOAT_ARRAY'}:
+ if self.property_type == 'FLOAT_ARRAY':
+ layout.prop(self, "array_length")
+ col = layout.column(align=True)
+ col.prop(self, "default_float", index=0, text="Default")
+ for i in range(1, self.array_length):
+ col.prop(self, "default_float", index=i, text=" ")
+ else:
+ layout.prop(self, "default_float", index=0)
+
+ col = layout.column(align=True)
+ col.prop(self, "min_float")
+ col.prop(self, "max_float")
+
+ col = layout.column()
+ col.prop(self, "is_overridable_library")
+ col.prop(self, "use_soft_limits")
+
+ col = layout.column(align=True)
+ col.enabled = self.use_soft_limits
+ col.prop(self, "soft_min_float", text="Soft Min")
+ col.prop(self, "soft_max_float", text="Max")
+
+ layout.prop(self, "step_float")
+ layout.prop(self, "precision")
+
+ # Subtype is only supported for float properties currently.
+ if self.property_type != 'FLOAT':
+ layout.prop(self, "subtype")
+ elif self.property_type in {'INT', 'INT_ARRAY'}:
+ if self.property_type == 'INT_ARRAY':
+ layout.prop(self, "array_length")
+ col = layout.column(align=True)
+ col.prop(self, "default_int", index=0, text="Default")
+ for i in range(1, self.array_length):
+ col.prop(self, "default_int", index=i, text=" ")
+ else:
+ layout.prop(self, "default_int", index=0)
- row = layout.row()
- row.enabled = proptype in {int, float, str}
- row.prop(self, "default")
+ col = layout.column(align=True)
+ col.prop(self, "min_int")
+ col.prop(self, "max_int")
- col = layout.column(align=True)
- col.prop(self, "min")
- col.prop(self, "max")
+ col = layout.column()
+ col.prop(self, "is_overridable_library")
+ col.prop(self, "use_soft_limits")
- col = layout.column()
- col.prop(self, "is_overridable_library")
- col.prop(self, "use_soft_limits")
+ col = layout.column(align=True)
+ col.enabled = self.use_soft_limits
+ col.prop(self, "soft_min_int", text="Soft Min")
+ col.prop(self, "soft_max_int", text="Max")
- col = layout.column(align=True)
- col.enabled = self.use_soft_limits
- col.prop(self, "soft_min", text="Soft Min")
- col.prop(self, "soft_max", text="Max")
- layout.prop(self, "description")
+ layout.prop(self, "step_int")
+ elif self.property_type == 'STRING':
+ layout.prop(self, "default_string")
- if is_array and proptype == float:
- layout.prop(self, "subtype")
+ if self.property_type == 'PYTHON':
+ layout.prop(self, "eval_string")
+ else:
+ layout.prop(self, "description")
class WM_OT_properties_add(Operator):
@@ -1706,7 +1901,7 @@ class WM_OT_properties_remove(Operator):
bl_options = {'UNDO', 'INTERNAL'}
data_path: rna_path
- property: rna_custom_property
+ property_name: rna_custom_property_name
def execute(self, context):
from rna_prop_ui import (
@@ -1719,9 +1914,9 @@ class WM_OT_properties_remove(Operator):
self.report({'ERROR'}, "Cannot remove properties from override data")
return {'CANCELLED'}
- prop = self.property
- rna_idprop_ui_prop_update(item, prop)
- del item[prop]
+ name = self.property_name
+ rna_idprop_ui_prop_update(item, name)
+ del item[name]
return {'FINISHED'}
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index d9ad094ac4f..ba5ecd1efde 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -639,7 +639,6 @@ class DATA_PT_mesh_attributes(MeshButtonsPanel, Panel):
add_attributes(mesh.attributes)
add_attributes(mesh.uv_layers)
- add_attributes(mesh.vertex_colors)
add_attributes(ob.vertex_groups)
colliding_names = [name for name, layers in attributes_by_name.items() if len(layers) >= 2]
diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index e52136fc416..5dd8c69f3d5 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -648,30 +648,6 @@ class ASSETBROWSER_MT_select(AssetBrowserMenu, Menu):
layout.operator("file.select_box")
-class ASSETBROWSER_PT_navigation_bar(asset_utils.AssetBrowserPanel, Panel):
- bl_label = "Asset Navigation"
- bl_region_type = 'TOOLS'
- bl_options = {'HIDE_HEADER'}
-
- @classmethod
- def poll(cls, context):
- return (
- asset_utils.AssetBrowserPanel.poll(context) and
- context.preferences.experimental.use_extended_asset_browser
- )
-
- def draw(self, context):
- layout = self.layout
-
- space_file = context.space_data
-
- col = layout.column()
-
- col.scale_x = 1.3
- col.scale_y = 1.3
- col.prop(space_file.params, "asset_category", expand=True)
-
-
class ASSETBROWSER_PT_metadata(asset_utils.AssetBrowserPanel, Panel):
bl_region_type = 'TOOL_PROPS'
bl_label = "Asset Metadata"
@@ -691,10 +667,23 @@ class ASSETBROWSER_PT_metadata(asset_utils.AssetBrowserPanel, Panel):
if asset_file_handle.local_id:
# If the active file is an ID, use its name directly so renaming is possible from right here.
layout.prop(asset_file_handle.local_id, "name", text="")
+
+ col = layout.column(align=True)
+ col.label(text="Asset Catalog:")
+ col.prop(asset_file_handle.local_id.asset_data, "catalog_id", text="UUID")
+ col.prop(asset_file_handle.local_id.asset_data, "catalog_simple_name", text="Simple Name")
+
row = layout.row()
row.label(text="Source: Current File")
else:
layout.prop(asset_file_handle, "name", text="")
+
+ col = layout.column(align=True)
+ col.enabled = False
+ col.label(text="Asset Catalog:")
+ col.prop(asset_file_handle.asset_data, "catalog_id", text="UUID")
+ col.prop(asset_file_handle.asset_data, "catalog_simple_name", text="Simple Name")
+
col = layout.column(align=True) # Just to reduce margin.
col.label(text="Source:")
row = col.row()
@@ -773,9 +762,10 @@ class ASSETBROWSER_MT_context_menu(AssetBrowserMenu, Menu):
layout.separator()
- sub = layout.row()
+ sub = layout.column()
sub.operator_context = 'EXEC_DEFAULT'
- sub.operator("asset.clear", text="Clear Asset")
+ sub.operator("asset.clear", text="Clear Asset").set_fake_user = False
+ sub.operator("asset.clear", text="Clear Asset (Set Fake User)").set_fake_user = True
layout.separator()
@@ -807,7 +797,6 @@ classes = (
ASSETBROWSER_MT_editor_menus,
ASSETBROWSER_MT_view,
ASSETBROWSER_MT_select,
- ASSETBROWSER_PT_navigation_bar,
ASSETBROWSER_PT_metadata,
ASSETBROWSER_PT_metadata_preview,
ASSETBROWSER_PT_metadata_details,
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 3ee668888f3..6a769b1aecc 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -598,16 +598,10 @@ class IMAGE_HT_tool_header(Header):
def draw(self, context):
layout = self.layout
- layout.template_header()
-
self.draw_tool_settings(context)
layout.separator_spacer()
- IMAGE_HT_header.draw_xform_template(layout, context)
-
- layout.separator_spacer()
-
self.draw_mode_settings(context)
def draw_tool_settings(self, context):
@@ -762,8 +756,7 @@ class IMAGE_HT_header(Header):
show_uvedit = sima.show_uvedit
show_maskedit = sima.show_maskedit
- if not show_region_tool_header:
- layout.template_header()
+ layout.template_header()
if sima.mode != 'UV':
layout.prop(sima, "ui_mode", text="")
@@ -784,8 +777,7 @@ class IMAGE_HT_header(Header):
layout.separator_spacer()
- if not show_region_tool_header:
- IMAGE_HT_header.draw_xform_template(layout, context)
+ IMAGE_HT_header.draw_xform_template(layout, context)
layout.template_ID(sima, "image", new="image.new", open="image.open")
@@ -934,6 +926,10 @@ class IMAGE_PT_snapping(Panel):
row = col.row(align=True)
row.prop(tool_settings, "snap_target", expand=True)
+ col.separator()
+ if 'INCREMENT' in tool_settings.snap_uv_element:
+ col.prop(tool_settings, "use_snap_uv_grid_absolute")
+
col.label(text="Affect")
row = col.row(align=True)
row.prop(tool_settings, "use_snap_translate", text="Move", toggle=True)
@@ -1467,6 +1463,33 @@ class IMAGE_PT_udim_grid(Panel):
col = layout.column()
col.prop(uvedit, "tile_grid_shape", text="Grid Shape")
+class IMAGE_PT_custom_grid(Panel):
+ bl_space_type = 'IMAGE_EDITOR'
+ bl_region_type = 'UI'
+ bl_category = "View"
+ bl_label = "Custom Grid"
+
+ @classmethod
+ def poll(cls, context):
+ sima = context.space_data
+ return sima.show_uvedit
+
+ def draw_header(self, context):
+ sima = context.space_data
+ uvedit = sima.uv_editor
+ self.layout.prop(uvedit, "use_custom_grid", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ sima = context.space_data
+ uvedit = sima.uv_editor
+
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ col = layout.column()
+ col.prop(uvedit, "custom_grid_subdivisions", text="Subdivisions")
class IMAGE_PT_overlay(Panel):
bl_space_type = 'IMAGE_EDITOR'
@@ -1652,6 +1675,7 @@ classes = (
IMAGE_PT_uv_cursor,
IMAGE_PT_annotation,
IMAGE_PT_udim_grid,
+ IMAGE_PT_custom_grid,
IMAGE_PT_overlay,
IMAGE_PT_overlay_uv_edit,
IMAGE_PT_overlay_uv_edit_geometry,
diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index 5f36009901a..f806fc345d1 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -754,6 +754,11 @@ class NodeTreeInterfacePanel:
# Display descriptions only for Geometry Nodes, since it's only used in the modifier panel.
if tree.type == 'GEOMETRY':
layout.prop(active_socket, "description")
+ field_socket_prefixes = {
+ "NodeSocketInt", "NodeSocketColor", "NodeSocketVector", "NodeSocketBool", "NodeSocketFloat"}
+ is_field_type = any(active_socket.bl_socket_idname.startswith(prefix) for prefix in field_socket_prefixes)
+ if in_out == "OUT" and is_field_type:
+ layout.prop(active_socket, "attribute_domain")
active_socket.draw(context, layout)
diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py
index febd064147f..3d18160d90f 100644
--- a/release/scripts/startup/bl_ui/space_outliner.py
+++ b/release/scripts/startup/bl_ui/space_outliner.py
@@ -323,7 +323,8 @@ class OUTLINER_MT_asset(Menu):
space = context.space_data
layout.operator("asset.mark")
- layout.operator("asset.clear")
+ layout.operator("asset.clear", text="Clear Asset").set_fake_user = False
+ layout.operator("asset.clear", text="Clear Asset (Set Fake User)").set_fake_user = True
class OUTLINER_PT_filter(Panel):
diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index 543164f25fc..197e3efebda 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -46,44 +46,85 @@ def selected_sequences_len(context):
def draw_color_balance(layout, color_balance):
+ layout.prop(color_balance, "correction_method")
+
layout.use_property_split = False
flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
- col = flow.column()
-
- box = col.box()
- split = box.split(factor=0.35)
- col = split.column(align=True)
- col.label(text="Lift:")
- col.separator()
- col.separator()
- col.prop(color_balance, "lift", text="")
- col.prop(color_balance, "invert_lift", text="Invert", icon='ARROW_LEFTRIGHT')
- split.template_color_picker(color_balance, "lift", value_slider=True, cubic=True)
-
- col = flow.column()
-
- box = col.box()
- split = box.split(factor=0.35)
- col = split.column(align=True)
- col.label(text="Gamma:")
- col.separator()
- col.separator()
- col.prop(color_balance, "gamma", text="")
- col.prop(color_balance, "invert_gamma", text="Invert", icon='ARROW_LEFTRIGHT')
- split.template_color_picker(color_balance, "gamma", value_slider=True, lock_luminosity=True, cubic=True)
-
- col = flow.column()
-
- box = col.box()
- split = box.split(factor=0.35)
- col = split.column(align=True)
- col.label(text="Gain:")
- col.separator()
- col.separator()
- col.prop(color_balance, "gain", text="")
- col.prop(color_balance, "invert_gain", text="Invert", icon='ARROW_LEFTRIGHT')
- split.template_color_picker(color_balance, "gain", value_slider=True, lock_luminosity=True, cubic=True)
+
+ if color_balance.correction_method == 'LIFT_GAMMA_GAIN':
+ col = flow.column()
+
+ box = col.box()
+ split = box.split(factor=0.35)
+ col = split.column(align=True)
+ col.label(text="Lift:")
+ col.separator()
+ col.separator()
+ col.prop(color_balance, "lift", text="")
+ col.prop(color_balance, "invert_lift", text="Invert", icon='ARROW_LEFTRIGHT')
+ split.template_color_picker(color_balance, "lift", value_slider=True, cubic=True)
+
+ col = flow.column()
+
+ box = col.box()
+ split = box.split(factor=0.35)
+ col = split.column(align=True)
+ col.label(text="Gamma:")
+ col.separator()
+ col.separator()
+ col.prop(color_balance, "gamma", text="")
+ col.prop(color_balance, "invert_gamma", text="Invert", icon='ARROW_LEFTRIGHT')
+ split.template_color_picker(color_balance, "gamma", value_slider=True, lock_luminosity=True, cubic=True)
+
+ col = flow.column()
+
+ box = col.box()
+ split = box.split(factor=0.35)
+ col = split.column(align=True)
+ col.label(text="Gain:")
+ col.separator()
+ col.separator()
+ col.prop(color_balance, "gain", text="")
+ col.prop(color_balance, "invert_gain", text="Invert", icon='ARROW_LEFTRIGHT')
+ split.template_color_picker(color_balance, "gain", value_slider=True, lock_luminosity=True, cubic=True)
+
+ elif color_balance.correction_method == 'OFFSET_POWER_SLOPE':
+ col = flow.column()
+
+ box = col.box()
+ split = box.split(factor=0.35)
+ col = split.column(align=True)
+ col.label(text="Offset:")
+ col.separator()
+ col.separator()
+ col.prop(color_balance, "offset", text="")
+ col.prop(color_balance, "invert_offset", text="Invert", icon='ARROW_LEFTRIGHT')
+ split.template_color_picker(color_balance, "offset", value_slider=True, cubic=True)
+
+ col = flow.column()
+
+ box = col.box()
+ split = box.split(factor=0.35)
+ col = split.column(align=True)
+ col.label(text="Power:")
+ col.separator()
+ col.separator()
+ col.prop(color_balance, "power", text="")
+ col.prop(color_balance, "invert_power", text="Invert", icon='ARROW_LEFTRIGHT')
+ split.template_color_picker(color_balance, "power", value_slider=True, cubic=True)
+
+ col = flow.column()
+
+ box = col.box()
+ split = box.split(factor=0.35)
+ col = split.column(align=True)
+ col.label(text="Slope:")
+ col.separator()
+ col.separator()
+ col.prop(color_balance, "slope", text="")
+ col.prop(color_balance, "invert_slope", text="Invert", icon='ARROW_LEFTRIGHT')
+ split.template_color_picker(color_balance, "slope", value_slider=True, cubic=True)
class SEQUENCER_PT_active_tool(ToolActivePanelHelper, Panel):
@@ -99,8 +140,6 @@ class SEQUENCER_HT_tool_header(Header):
def draw(self, context):
layout = self.layout
- layout.template_header()
-
self.draw_tool_settings(context)
# TODO: options popover.
@@ -132,8 +171,7 @@ class SEQUENCER_HT_header(Header):
show_region_tool_header = st.show_region_tool_header
- if not show_region_tool_header:
- layout.template_header()
+ layout.template_header()
layout.prop(st, "view_type", text="")
@@ -151,6 +189,12 @@ class SEQUENCER_HT_header(Header):
if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}:
row = layout.row(align=True)
row.prop(sequencer_tool_settings, "overlap_mode", text="")
+
+ if st.view_type == 'SEQUENCER_PREVIEW':
+ row = layout.row(align=True)
+ row.prop(sequencer_tool_settings, "pivot_point", text="", icon_only=True)
+
+ if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}:
row = layout.row(align=True)
row.prop(tool_settings, "use_snap_sequencer", text="")
sub = row.row(align=True)
@@ -242,6 +286,7 @@ class SEQUENCER_PT_sequencer_overlay(Panel):
layout.prop(overlay_settings, "show_strip_name", text="Name")
layout.prop(overlay_settings, "show_strip_source", text="Source")
layout.prop(overlay_settings, "show_strip_duration", text="Duration")
+ layout.prop(overlay_settings, "show_strip_tag_color", text="Color Tags")
layout.separator()
@@ -375,9 +420,9 @@ class SEQUENCER_MT_view(Menu):
layout.operator("view2d.zoom_border", text="Zoom")
layout.menu("SEQUENCER_MT_preview_zoom")
- if st.display_mode == 'IMAGE':
- layout.prop(st, "use_zoom_to_fit")
- elif st.display_mode == 'WAVEFORM':
+ layout.prop(st, "use_zoom_to_fit")
+
+ if st.display_mode == 'WAVEFORM':
layout.separator()
layout.prop(st, "show_separate_color", text="Show Separate Color Channels")
@@ -870,6 +915,9 @@ class SEQUENCER_MT_strip(Menu):
layout.operator("sequencer.meta_toggle", text="Toggle Meta")
layout.separator()
+ layout.menu("SEQUENCER_MT_color_tag_picker")
+
+ layout.separator()
layout.menu("SEQUENCER_MT_strip_lock_mute")
layout.separator()
@@ -966,6 +1014,9 @@ class SEQUENCER_MT_context_menu(Menu):
layout.operator("sequencer.meta_toggle", text="Toggle Meta")
layout.separator()
+ layout.menu("SEQUENCER_MT_color_tag_picker")
+
+ layout.separator()
layout.menu("SEQUENCER_MT_strip_lock_mute")
@@ -997,6 +1048,41 @@ class SequencerButtonsPanel_Output:
return cls.has_preview(context)
+class SEQUENCER_PT_color_tag_picker(Panel):
+ bl_label = "Color Tag"
+ bl_space_type = 'SEQUENCE_EDITOR'
+ bl_region_type = 'UI'
+ bl_category = "Strip"
+ bl_options = {'HIDE_HEADER', 'INSTANCED'}
+
+ @classmethod
+ def poll(cls, context):
+ return context.active_sequence_strip is not None
+
+ def draw(self, context):
+ layout = self.layout
+
+ row = layout.row(align=True)
+ row.operator("sequencer.strip_color_tag_set", icon="X").color = 'NONE'
+ for i in range(1, 10):
+ icon = 'SEQUENCE_COLOR_%02d' % i
+ row.operator("sequencer.strip_color_tag_set", icon=icon).color = 'COLOR_%02d' % i
+
+
+class SEQUENCER_MT_color_tag_picker(Menu):
+ bl_label = "Set Color Tag"
+
+ @classmethod
+ def poll(cls, context):
+ return context.active_sequence_strip is not None
+
+ def draw(self, context):
+ layout = self.layout
+
+ row = layout.row(align=True)
+ row.operator_enum("sequencer.strip_color_tag_set", "color", icon_only=True)
+
+
class SEQUENCER_PT_strip(SequencerButtonsPanel, Panel):
bl_label = ""
bl_options = {'HIDE_HEADER'}
@@ -1040,9 +1126,20 @@ class SEQUENCER_PT_strip(SequencerButtonsPanel, Panel):
else:
icon_header = 'SEQ_SEQUENCER'
- row = layout.row()
+ row = layout.row(align=True)
+ row.use_property_decorate = False
row.label(text="", icon=icon_header)
+ row.separator()
row.prop(strip, "name", text="")
+
+ sub = row.row(align=True)
+ if strip.color_tag == 'NONE':
+ sub.popover(panel="SEQUENCER_PT_color_tag_picker", text="", icon='COLOR')
+ else:
+ icon = 'SEQUENCE_' + strip.color_tag
+ sub.popover(panel="SEQUENCER_PT_color_tag_picker", text="", icon=icon)
+
+ row.separator()
row.prop(strip, "mute", toggle=True, icon_only=True, emboss=False)
@@ -2328,8 +2425,11 @@ classes = (
SEQUENCER_MT_strip_transform,
SEQUENCER_MT_strip_input,
SEQUENCER_MT_strip_lock_mute,
+ SEQUENCER_MT_color_tag_picker,
SEQUENCER_MT_context_menu,
+ SEQUENCER_PT_color_tag_picker,
+
SEQUENCER_PT_active_tool,
SEQUENCER_PT_strip,
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py
index 98e29d3baba..4a598d0aa63 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_common.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py
@@ -190,7 +190,7 @@ class ToolActivePanelHelper:
ToolSelectPanelHelper.draw_active_tool_header(
context,
layout.column(),
- show_tool_name=True,
+ show_tool_icon=True,
tool_key=ToolSelectPanelHelper._tool_key_from_context(context, space_type=self.bl_space_type),
)
@@ -766,7 +766,7 @@ class ToolSelectPanelHelper:
def draw_active_tool_header(
context, layout,
*,
- show_tool_name=False,
+ show_tool_icon=False,
tool_key=None,
):
if tool_key is None:
@@ -783,9 +783,12 @@ class ToolSelectPanelHelper:
return None
# Note: we could show 'item.text' here but it makes the layout jitter when switching tools.
# Add some spacing since the icon is currently assuming regular small icon size.
- layout.label(text=" " + item.label if show_tool_name else " ", icon_value=icon_value)
- if show_tool_name:
+ if show_tool_icon:
+ layout.label(text=" " + item.label, icon_value=icon_value)
layout.separator()
+ else:
+ layout.label(text=item.label)
+
draw_settings = item.draw_settings
if draw_settings is not None:
draw_settings(context, layout, tool)
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index a4a51cb9910..5970d6fdf2b 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -497,18 +497,14 @@ class _defs_view3d_add:
props = tool.operator_properties("view3d.interactive_add")
if not extra:
row = layout.row()
- row.scale_x = 0.8
row.label(text="Depth:")
row = layout.row()
- row.scale_x = 0.9
row.prop(props, "plane_depth", text="")
row = layout.row()
- row.scale_x = 0.8
row.label(text="Orientation:")
row = layout.row()
row.prop(props, "plane_orientation", text="")
row = layout.row()
- row.scale_x = 0.8
row.prop(props, "snap_target")
region_is_header = bpy.context.region.type == 'TOOL_HEADER'
@@ -1691,6 +1687,7 @@ class _defs_weight_paint:
props = tool.operator_properties("paint.weight_gradient")
layout.prop(props, "type", expand=True)
+ layout.popover("VIEW3D_PT_tools_weight_gradient")
return dict(
idname="builtin.gradient",
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index 0093110d326..7a8b6d42cad 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -1073,6 +1073,25 @@ class USERPREF_PT_theme_collection_colors(ThemePanel, CenterAlignMixIn, Panel):
flow.prop(ui, "color", text=iface_("Color %d") % i, translate=False)
+class USERPREF_PT_theme_strip_colors(ThemePanel, CenterAlignMixIn, Panel):
+ bl_label = "Strip Colors"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw_header(self, _context):
+ layout = self.layout
+
+ layout.label(icon='SEQ_STRIP_DUPLICATE')
+
+ def draw_centered(self, context, layout):
+ theme = context.preferences.themes[0]
+
+ layout.use_property_split = True
+
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+ for i, ui in enumerate(theme.strip_color, 1):
+ flow.prop(ui, "color", text=iface_("Color %d") % i, translate=False)
+
+
# Base class for dynamically defined theme-space panels.
# This is not registered.
class PreferenceThemeSpacePanel:
@@ -2251,7 +2270,6 @@ class USERPREF_PT_experimental_new_features(ExperimentalPanel, Panel):
({"property": "use_sculpt_tools_tilt"}, "T82877"),
({"property": "use_extended_asset_browser"}, ("project/view/130/", "Project Page")),
({"property": "use_override_templates"}, ("T73318", "Milestone 4")),
- ({"property": "use_geometry_nodes_fields"}, "T91274"),
),
)
@@ -2283,7 +2301,9 @@ class USERPREF_PT_experimental_debugging(ExperimentalPanel, Panel):
context, (
({"property": "use_undo_legacy"}, "T60695"),
({"property": "override_auto_resync"}, "T83811"),
+ ({"property": "proxy_to_override_auto_conversion"}, "T91671"),
({"property": "use_cycles_debug"}, None),
+ ({"property": "use_geometry_nodes_legacy"}, "T91274"),
),
)
@@ -2347,6 +2367,7 @@ classes = (
USERPREF_PT_theme_text_style,
USERPREF_PT_theme_bone_color_sets,
USERPREF_PT_theme_collection_colors,
+ USERPREF_PT_theme_strip_colors,
USERPREF_PT_file_paths_data,
USERPREF_PT_file_paths_render,
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 3879f7de250..281c57b282f 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -46,16 +46,10 @@ class VIEW3D_HT_tool_header(Header):
def draw(self, context):
layout = self.layout
- layout.row(align=True).template_header()
-
self.draw_tool_settings(context)
layout.separator_spacer()
- VIEW3D_HT_header.draw_xform_template(layout, context)
-
- layout.separator_spacer()
-
self.draw_mode_settings(context)
def draw_tool_settings(self, context):
@@ -604,10 +598,8 @@ class VIEW3D_HT_header(Header):
tool_settings = context.tool_settings
view = context.space_data
shading = view.shading
- show_region_tool_header = view.show_region_tool_header
- if not show_region_tool_header:
- layout.row(align=True).template_header()
+ layout.row(align=True).template_header()
row = layout.row(align=True)
obj = context.active_object
@@ -754,7 +746,7 @@ class VIEW3D_HT_header(Header):
)
layout.separator_spacer()
- elif not show_region_tool_header:
+ else:
# Transform settings depending on tool header visibility
VIEW3D_HT_header.draw_xform_template(layout, context)
@@ -2234,8 +2226,6 @@ class VIEW3D_MT_object_relations(Menu):
def draw(self, _context):
layout = self.layout
- layout.operator("object.proxy_make", text="Make Proxy...")
-
layout.operator("object.make_override_library", text="Make Library Override...")
layout.operator("object.convert_proxy_to_override")
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 16b5ed33f3f..acc3d933b85 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -688,6 +688,39 @@ class VIEW3D_PT_tools_brush_stroke_smooth_stroke(Panel, View3DPaintPanel, Smooth
bl_options = {'DEFAULT_CLOSED'}
+class VIEW3D_PT_tools_weight_gradient(Panel, View3DPaintPanel):
+ bl_context = ".weightpaint" # dot on purpose (access from topbar)
+ bl_label = "Falloff"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ settings = context.tool_settings.weight_paint
+ brush = settings.brush
+ return brush is not None
+
+ def draw(self, context):
+ layout = self.layout
+ settings = context.tool_settings.weight_paint
+ brush = settings.brush
+
+ col = layout.column(align=True)
+ row = col.row(align=True)
+ row.prop(brush, "curve_preset", text="")
+
+ if brush.curve_preset == 'CUSTOM':
+ layout.template_curve_mapping(brush, "curve", brush=True)
+
+ col = layout.column(align=True)
+ row = col.row(align=True)
+ row.operator("brush.curve_preset", icon='SMOOTHCURVE', text="").shape = 'SMOOTH'
+ row.operator("brush.curve_preset", icon='SPHERECURVE', text="").shape = 'ROUND'
+ row.operator("brush.curve_preset", icon='ROOTCURVE', text="").shape = 'ROOT'
+ row.operator("brush.curve_preset", icon='SHARPCURVE', text="").shape = 'SHARP'
+ row.operator("brush.curve_preset", icon='LINCURVE', text="").shape = 'LINE'
+ row.operator("brush.curve_preset", icon='NOCURVE', text="").shape = 'MAX'
+
+
# TODO, move to space_view3d.py
class VIEW3D_PT_tools_brush_falloff(Panel, View3DPaintPanel, FalloffPanel):
bl_context = ".paint_common" # dot on purpose (access from topbar)
@@ -2219,6 +2252,7 @@ classes = (
VIEW3D_PT_tools_brush_falloff_frontface,
VIEW3D_PT_tools_brush_falloff_normal,
VIEW3D_PT_tools_brush_display,
+ VIEW3D_PT_tools_weight_gradient,
VIEW3D_PT_sculpt_dyntopo,
VIEW3D_PT_sculpt_voxel_remesh,
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 9ad162da7dc..37d5c5997ad 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -180,11 +180,8 @@ def object_eevee_cycles_shader_nodes_poll(context):
eevee_cycles_shader_nodes_poll(context))
-def geometry_nodes_fields_poll(context):
- return context.preferences.experimental.use_geometry_nodes_fields
-
-def geometry_nodes_fields_legacy_poll(context):
- return not context.preferences.experimental.use_geometry_nodes_fields
+def geometry_nodes_legacy_poll(context):
+ return context.preferences.experimental.use_geometry_nodes_legacy
# All standard node categories currently used in nodes.
@@ -282,6 +279,7 @@ shader_node_categories = [
]),
ShaderNodeCategory("SH_NEW_CONVERTOR", "Converter", items=[
NodeItem("ShaderNodeMapRange"),
+ NodeItem("ShaderNodeFloatCurve"),
NodeItem("ShaderNodeClamp"),
NodeItem("ShaderNodeMath"),
NodeItem("ShaderNodeValToRGB"),
@@ -483,27 +481,27 @@ texture_node_categories = [
geometry_node_categories = [
# Geometry Nodes
GeometryNodeCategory("GEO_ATTRIBUTE", "Attribute", items=[
- NodeItem("GeometryNodeLegacyAttributeRandomize", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeMath", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeClamp", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeCompare", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeConvert", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeCurveMap", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeFill", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeMix", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeProximity", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeColorRamp", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeVectorMath", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeVectorRotate", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeSampleTexture", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeCombineXYZ", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeSeparateXYZ", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeMapRange", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAttributeTransfer", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeAttributeRemove", poll=geometry_nodes_fields_legacy_poll),
-
- NodeItem("GeometryNodeAttributeCapture", poll=geometry_nodes_fields_poll),
- NodeItem("GeometryNodeAttributeStatistic", poll=geometry_nodes_fields_poll),
+ NodeItem("GeometryNodeLegacyAttributeRandomize", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeMath", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeClamp", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeCompare", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeConvert", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeCurveMap", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeFill", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeMix", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeProximity", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeColorRamp", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeVectorMath", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeVectorRotate", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeSampleTexture", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeCombineXYZ", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeSeparateXYZ", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeMapRange", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAttributeTransfer", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeAttributeRemove", poll=geometry_nodes_legacy_poll),
+
+ NodeItem("GeometryNodeAttributeCapture"),
+ NodeItem("GeometryNodeAttributeStatistic"),
]),
GeometryNodeCategory("GEO_COLOR", "Color", items=[
NodeItem("ShaderNodeMixRGB"),
@@ -513,24 +511,29 @@ geometry_node_categories = [
NodeItem("ShaderNodeCombineRGB"),
]),
GeometryNodeCategory("GEO_CURVE", "Curve", items=[
- NodeItem("GeometryNodeLegacyCurveSubdivide", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyCurveReverse", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyCurveSplineType", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyCurveSetHandles", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyCurveSelectHandles", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyMeshToCurve", poll=geometry_nodes_fields_legacy_poll),
+ NodeItem("GeometryNodeLegacyCurveSubdivide", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyCurveReverse", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyCurveSplineType", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyCurveSetHandles", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyCurveSelectHandles", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyMeshToCurve", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyCurveToPoints", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyCurveEndpoints", poll=geometry_nodes_legacy_poll),
NodeItem("GeometryNodeCurveToMesh"),
NodeItem("GeometryNodeCurveResample"),
- NodeItem("GeometryNodeCurveToPoints"),
- NodeItem("GeometryNodeCurveEndpoints"),
NodeItem("GeometryNodeCurveFill"),
NodeItem("GeometryNodeCurveTrim"),
NodeItem("GeometryNodeCurveLength"),
- NodeItem("GeometryNodeCurveParameter", poll=geometry_nodes_fields_poll),
- NodeItem("GeometryNodeInputTangent", poll=geometry_nodes_fields_poll),
- NodeItem("GeometryNodeCurveSample", poll=geometry_nodes_fields_poll),
- NodeItem("GeometryNodeCurveFillet", poll=geometry_nodes_fields_poll),
+ NodeItem("GeometryNodeCurveSplineType"),
+ NodeItem("GeometryNodeSplineLength"),
+ NodeItem("GeometryNodeCurveSubdivide"),
+ NodeItem("GeometryNodeCurveParameter"),
+ NodeItem("GeometryNodeCurveSetHandles"),
+ NodeItem("GeometryNodeInputTangent"),
+ NodeItem("GeometryNodeCurveSample"),
+ NodeItem("GeometryNodeCurveFillet"),
+ NodeItem("GeometryNodeCurveReverse"),
]),
GeometryNodeCategory("GEO_PRIMITIVES_CURVE", "Curve Primitives", items=[
NodeItem("GeometryNodeCurvePrimitiveLine"),
@@ -542,44 +545,48 @@ geometry_node_categories = [
NodeItem("GeometryNodeCurvePrimitiveBezierSegment"),
]),
GeometryNodeCategory("GEO_GEOMETRY", "Geometry", items=[
- NodeItem("GeometryNodeLegacyDeleteGeometry", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyRaycast", poll=geometry_nodes_fields_legacy_poll),
+ NodeItem("GeometryNodeLegacyDeleteGeometry", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyRaycast", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeProximity"),
NodeItem("GeometryNodeBoundBox"),
NodeItem("GeometryNodeConvexHull"),
NodeItem("GeometryNodeTransform"),
NodeItem("GeometryNodeJoinGeometry"),
NodeItem("GeometryNodeSeparateComponents"),
- NodeItem("GeometryNodeSetPosition", poll=geometry_nodes_fields_poll),
- NodeItem("GeometryNodeRealizeInstances", poll=geometry_nodes_fields_poll),
+ NodeItem("GeometryNodeSetPosition"),
+ NodeItem("GeometryNodeRealizeInstances"),
]),
GeometryNodeCategory("GEO_INPUT", "Input", items=[
+ NodeItem("FunctionNodeLegacyRandomFloat", poll=geometry_nodes_legacy_poll),
+
NodeItem("GeometryNodeObjectInfo"),
NodeItem("GeometryNodeCollectionInfo"),
- NodeItem("FunctionNodeRandomFloat"),
NodeItem("ShaderNodeValue"),
NodeItem("FunctionNodeInputString"),
NodeItem("FunctionNodeInputVector"),
NodeItem("GeometryNodeInputMaterial"),
NodeItem("GeometryNodeIsViewport"),
- NodeItem("GeometryNodeInputPosition", poll=geometry_nodes_fields_poll),
- NodeItem("GeometryNodeInputIndex", poll=geometry_nodes_fields_poll),
- NodeItem("GeometryNodeInputNormal", poll=geometry_nodes_fields_poll),
+ NodeItem("GeometryNodeInputPosition"),
+ NodeItem("GeometryNodeInputIndex"),
+ NodeItem("GeometryNodeInputNormal"),
]),
GeometryNodeCategory("GEO_MATERIAL", "Material", items=[
- NodeItem("GeometryNodeLegacyMaterialAssign", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacySelectByMaterial", poll=geometry_nodes_fields_legacy_poll),
+ NodeItem("GeometryNodeLegacyMaterialAssign", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacySelectByMaterial", poll=geometry_nodes_legacy_poll),
- NodeItem("GeometryNodeMaterialAssign", poll=geometry_nodes_fields_poll),
- NodeItem("GeometryNodeMaterialSelection", poll=geometry_nodes_fields_poll),
+ NodeItem("GeometryNodeMaterialAssign"),
+ NodeItem("GeometryNodeMaterialSelection"),
NodeItem("GeometryNodeMaterialReplace"),
]),
GeometryNodeCategory("GEO_MESH", "Mesh", items=[
+ NodeItem("GeometryNodeLegacyEdgeSplit", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacySubdivisionSurface", poll=geometry_nodes_legacy_poll),
+
NodeItem("GeometryNodeBoolean"),
NodeItem("GeometryNodeTriangulate"),
- NodeItem("GeometryNodeEdgeSplit"),
- NodeItem("GeometryNodeSubdivisionSurface"),
NodeItem("GeometryNodeMeshSubdivide"),
+ NodeItem("GeometryNodePointsToVertices"),
]),
GeometryNodeCategory("GEO_PRIMITIVES_MESH", "Mesh Primitives", items=[
NodeItem("GeometryNodeMeshCircle"),
@@ -592,31 +599,39 @@ geometry_node_categories = [
NodeItem("GeometryNodeMeshUVSphere"),
]),
GeometryNodeCategory("GEO_POINT", "Point", items=[
- NodeItem("GeometryNodeLegacyPointDistribute", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyPointInstance", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyPointSeparate", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyPointScale", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyPointTranslate", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyRotatePoints", poll=geometry_nodes_fields_legacy_poll),
- NodeItem("GeometryNodeLegacyAlignRotationToVector", poll=geometry_nodes_fields_legacy_poll),
+ NodeItem("GeometryNodeMeshToPoints"),
+ NodeItem("GeometryNodeInstanceOnPoints"),
+ NodeItem("GeometryNodeDistributePointsOnFaces"),
+ NodeItem("GeometryNodeLegacyPointDistribute", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyPointInstance", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyPointSeparate", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyPointScale", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyPointTranslate", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyRotatePoints", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyAlignRotationToVector", poll=geometry_nodes_legacy_poll),
]),
GeometryNodeCategory("GEO_TEXT", "Text", items=[
NodeItem("FunctionNodeStringLength"),
NodeItem("FunctionNodeStringSubstring"),
NodeItem("FunctionNodeValueToString"),
NodeItem("GeometryNodeStringJoin"),
+ NodeItem("FunctionNodeInputSpecialCharacters"),
+ NodeItem("GeometryNodeStringToCurves"),
]),
GeometryNodeCategory("GEO_UTILITIES", "Utilities", items=[
NodeItem("ShaderNodeMapRange"),
+ NodeItem("ShaderNodeFloatCurve"),
NodeItem("ShaderNodeClamp"),
NodeItem("ShaderNodeMath"),
NodeItem("FunctionNodeBooleanMath"),
+ NodeItem("FunctionNodeRotateEuler"),
NodeItem("FunctionNodeFloatCompare"),
NodeItem("FunctionNodeFloatToInt"),
NodeItem("GeometryNodeSwitch"),
+ NodeItem("FunctionNodeRandomValue"),
]),
GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[
- NodeItem("ShaderNodeTexNoise", poll=geometry_nodes_fields_poll),
+ NodeItem("ShaderNodeTexNoise"),
]),
GeometryNodeCategory("GEO_VECTOR", "Vector", items=[
NodeItem("ShaderNodeVectorCurve"),
@@ -629,7 +644,7 @@ geometry_node_categories = [
NodeItem("GeometryNodeViewer"),
]),
GeometryNodeCategory("GEO_VOLUME", "Volume", items=[
- NodeItem("GeometryNodeLegacyPointsToVolume", poll=geometry_nodes_fields_legacy_poll),
+ NodeItem("GeometryNodeLegacyPointsToVolume", poll=geometry_nodes_legacy_poll),
NodeItem("GeometryNodeVolumeToMesh"),
]),