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:
-rw-r--r--release/scripts/startup/bl_operators/__init__.py10
-rw-r--r--release/scripts/startup/bl_operators/add_mesh_torus.py5
-rw-r--r--release/scripts/startup/bl_operators/anim.py8
-rw-r--r--release/scripts/startup/bl_operators/clip.py14
-rw-r--r--release/scripts/startup/bl_operators/console.py9
-rw-r--r--release/scripts/startup/bl_operators/file.py5
-rw-r--r--release/scripts/startup/bl_operators/freestyle.py8
-rw-r--r--release/scripts/startup/bl_operators/image.py8
-rw-r--r--release/scripts/startup/bl_operators/mask.py5
-rw-r--r--release/scripts/startup/bl_operators/mesh.py7
-rw-r--r--release/scripts/startup/bl_operators/node.py11
-rw-r--r--release/scripts/startup/bl_operators/object.py19
-rw-r--r--release/scripts/startup/bl_operators/object_align.py5
-rw-r--r--release/scripts/startup/bl_operators/object_quick_effects.py8
-rw-r--r--release/scripts/startup/bl_operators/object_randomize_transform.py5
-rw-r--r--release/scripts/startup/bl_operators/presets.py23
-rw-r--r--release/scripts/startup/bl_operators/rigidbody.py7
-rw-r--r--release/scripts/startup/bl_operators/screen_play_rendered_anim.py5
-rw-r--r--release/scripts/startup/bl_operators/sequencer.py7
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_follow_active.py5
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_lightmap.py5
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_smart_project.py5
-rw-r--r--release/scripts/startup/bl_operators/vertexpaint_dirt.py5
-rw-r--r--release/scripts/startup/bl_operators/view3d.py8
-rw-r--r--release/scripts/startup/bl_operators/wm.py55
-rw-r--r--release/scripts/startup/bl_ui/__init__.py11
-rw-r--r--release/scripts/startup/bl_ui/properties_animviz.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_collection.py11
-rw-r--r--release/scripts/startup/bl_ui/properties_constraint.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_data_armature.py18
-rw-r--r--release/scripts/startup/bl_ui/properties_data_bone.py17
-rw-r--r--release/scripts/startup/bl_ui/properties_data_camera.py17
-rw-r--r--release/scripts/startup/bl_ui/properties_data_curve.py18
-rw-r--r--release/scripts/startup/bl_ui/properties_data_empty.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_data_lamp.py18
-rw-r--r--release/scripts/startup/bl_ui/properties_data_lattice.py11
-rw-r--r--release/scripts/startup/bl_ui/properties_data_mesh.py21
-rw-r--r--release/scripts/startup/bl_ui/properties_data_metaball.py13
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py8
-rw-r--r--release/scripts/startup/bl_ui/properties_data_speaker.py13
-rw-r--r--release/scripts/startup/bl_ui/properties_freestyle.py14
-rw-r--r--release/scripts/startup/bl_ui/properties_game.py27
-rw-r--r--release/scripts/startup/bl_ui/properties_grease_pencil_common.py21
-rw-r--r--release/scripts/startup/bl_ui/properties_mask_common.py14
-rw-r--r--release/scripts/startup/bl_ui/properties_material.py35
-rw-r--r--release/scripts/startup/bl_ui/properties_object.py20
-rw-r--r--release/scripts/startup/bl_ui/properties_paint_common.py10
-rw-r--r--release/scripts/startup/bl_ui/properties_particle.py26
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_cloth.py14
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_common.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py26
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_field.py10
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_fluid.py13
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_rigidbody.py11
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py8
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_smoke.py16
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_softbody.py15
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py22
-rw-r--r--release/scripts/startup/bl_ui/properties_render_layer.py11
-rw-r--r--release/scripts/startup/bl_ui/properties_scene.py22
-rw-r--r--release/scripts/startup/bl_ui/properties_texture.py35
-rw-r--r--release/scripts/startup/bl_ui/properties_world.py17
-rw-r--r--release/scripts/startup/bl_ui/space_clip.py66
-rw-r--r--release/scripts/startup/bl_ui/space_console.py12
-rw-r--r--release/scripts/startup/bl_ui/space_dopesheet.py18
-rw-r--r--release/scripts/startup/bl_ui/space_filebrowser.py15
-rw-r--r--release/scripts/startup/bl_ui/space_graph.py15
-rw-r--r--release/scripts/startup/bl_ui/space_image.py56
-rw-r--r--release/scripts/startup/bl_ui/space_info.py20
-rw-r--r--release/scripts/startup/bl_ui/space_logic.py13
-rw-r--r--release/scripts/startup/bl_ui/space_nla.py16
-rw-r--r--release/scripts/startup/bl_ui/space_node.py29
-rw-r--r--release/scripts/startup/bl_ui/space_outliner.py13
-rw-r--r--release/scripts/startup/bl_ui/space_properties.py18
-rw-r--r--release/scripts/startup/bl_ui/space_sequencer.py34
-rw-r--r--release/scripts/startup/bl_ui/space_text.py22
-rw-r--r--release/scripts/startup/bl_ui/space_time.py15
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py26
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py149
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py66
-rw-r--r--release/scripts/startup/keyingsets_builtins.py32
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c13
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c9
-rw-r--r--source/blender/editors/interface/interface.c14
-rw-r--r--source/blender/editors/util/numinput.c2
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c2
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c8
-rw-r--r--source/blender/python/BPY_extern.h3
-rw-r--r--source/blender/python/generic/py_capi_utils.c51
-rw-r--r--source/blender/python/generic/py_capi_utils.h7
-rw-r--r--source/blender/python/intern/bpy_interface.c46
-rw-r--r--source/blender/python/intern/bpy_utils_units.c2
-rw-r--r--tests/python/CMakeLists.txt5
-rw-r--r--tests/python/bl_pyapi_idprop.py144
94 files changed, 1662 insertions, 130 deletions
diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py
index a696410ca1c..c28c1461003 100644
--- a/release/scripts/startup/bl_operators/__init__.py
+++ b/release/scripts/startup/bl_operators/__init__.py
@@ -63,8 +63,14 @@ del _namespace
def register():
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for mod in _modules_loaded:
+ for cls in mod.classes:
+ register_class(cls)
def unregister():
- bpy.utils.unregister_module(__name__)
+ from bpy.utils import unregister_class
+ for mod in reversed(_modules_loaded):
+ for cls in reversed(mod.classes):
+ unregister_class(cls)
diff --git a/release/scripts/startup/bl_operators/add_mesh_torus.py b/release/scripts/startup/bl_operators/add_mesh_torus.py
index 247b91e147f..0e5acea94f9 100644
--- a/release/scripts/startup/bl_operators/add_mesh_torus.py
+++ b/release/scripts/startup/bl_operators/add_mesh_torus.py
@@ -282,3 +282,8 @@ class AddTorus(Operator, object_utils.AddObjectHelper):
object_utils.object_data_add(context, mesh, operator=self)
return {'FINISHED'}
+
+
+classes = (
+ AddTorus,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/anim.py b/release/scripts/startup/bl_operators/anim.py
index c20d591241c..e1a0b3c9908 100644
--- a/release/scripts/startup/bl_operators/anim.py
+++ b/release/scripts/startup/bl_operators/anim.py
@@ -412,3 +412,11 @@ class UpdateAnimatedTransformConstraint(Operator):
text.from_string(log)
self.report({'INFO'}, "Complete report available on '%s' text datablock" % text.name)
return {'FINISHED'}
+
+
+classes = (
+ ANIM_OT_keying_set_export,
+ BakeAction,
+ ClearUselessActions,
+ UpdateAnimatedTransformConstraint,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/clip.py b/release/scripts/startup/bl_operators/clip.py
index d60703236d6..e3a7bd384c6 100644
--- a/release/scripts/startup/bl_operators/clip.py
+++ b/release/scripts/startup/bl_operators/clip.py
@@ -1071,3 +1071,17 @@ class CLIP_OT_track_settings_to_track(bpy.types.Operator):
setattr(marker_selected, attr, getattr(marker, attr))
return {'FINISHED'}
+
+
+classes = (
+ CLIP_OT_bundles_to_mesh,
+ CLIP_OT_constraint_to_fcurve,
+ CLIP_OT_delete_proxy,
+ CLIP_OT_filter_tracks,
+ CLIP_OT_set_active_clip,
+ CLIP_OT_set_viewport_background,
+ CLIP_OT_setup_tracking_scene,
+ CLIP_OT_track_settings_as_default,
+ CLIP_OT_track_settings_to_track,
+ CLIP_OT_track_to_empty,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/console.py b/release/scripts/startup/bl_operators/console.py
index 8cfc977294a..fb36f80239e 100644
--- a/release/scripts/startup/bl_operators/console.py
+++ b/release/scripts/startup/bl_operators/console.py
@@ -159,3 +159,12 @@ class ConsoleLanguage(Operator):
remove_duplicates=True)
return {'FINISHED'}
+
+
+classes = (
+ ConsoleAutocomplete,
+ ConsoleBanner,
+ ConsoleCopyAsScript,
+ ConsoleExec,
+ ConsoleLanguage,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/file.py b/release/scripts/startup/bl_operators/file.py
index 51e079164b6..d710b9af715 100644
--- a/release/scripts/startup/bl_operators/file.py
+++ b/release/scripts/startup/bl_operators/file.py
@@ -248,3 +248,8 @@ class WM_OT_previews_batch_clear(Operator):
return {'FINISHED'}
+
+classes = (
+ WM_OT_previews_batch_clear,
+ WM_OT_previews_batch_generate,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/freestyle.py b/release/scripts/startup/bl_operators/freestyle.py
index 43cd3110beb..ae2287ee7bb 100644
--- a/release/scripts/startup/bl_operators/freestyle.py
+++ b/release/scripts/startup/bl_operators/freestyle.py
@@ -218,3 +218,11 @@ class SCENE_OT_freestyle_module_open(bpy.types.Operator):
text = bpy.data.texts.load(self.filepath, self.make_internal)
self.freestyle_module.script = text
return {'FINISHED'}
+
+
+classes = (
+ SCENE_OT_freestyle_add_edge_marks_to_keying_set,
+ SCENE_OT_freestyle_add_face_marks_to_keying_set,
+ SCENE_OT_freestyle_fill_range_by_selection,
+ SCENE_OT_freestyle_module_open,
+)
diff --git a/release/scripts/startup/bl_operators/image.py b/release/scripts/startup/bl_operators/image.py
index d3460383fe7..6a538f0ae33 100644
--- a/release/scripts/startup/bl_operators/image.py
+++ b/release/scripts/startup/bl_operators/image.py
@@ -242,3 +242,11 @@ class ProjectApply(Operator):
bpy.ops.paint.project_image(image=image_name)
return {'FINISHED'}
+
+
+classes = (
+ EditExternally,
+ ProjectApply,
+ ProjectEdit,
+ SaveDirty,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/mask.py b/release/scripts/startup/bl_operators/mask.py
index aa984659430..78a4bd9af27 100644
--- a/release/scripts/startup/bl_operators/mask.py
+++ b/release/scripts/startup/bl_operators/mask.py
@@ -31,3 +31,8 @@ class MASK_MT_add(Menu):
layout.operator_context = 'INVOKE_REGION_WIN'
layout.operator("mask.primitive_circle_add", text="Circle", icon='MESH_CIRCLE')
layout.operator("mask.primitive_square_add", text="Square", icon='MESH_PLANE')
+
+
+classes = (
+ MASK_MT_add,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/mesh.py b/release/scripts/startup/bl_operators/mesh.py
index 58eab5436e6..bce38a6bf3a 100644
--- a/release/scripts/startup/bl_operators/mesh.py
+++ b/release/scripts/startup/bl_operators/mesh.py
@@ -248,3 +248,10 @@ class MehsSetNormalsFromFaces(Operator):
return {'FINISHED'}
+
+classes = (
+ MehsSetNormalsFromFaces,
+ MeshMirrorUV,
+ MeshSelectNext,
+ MeshSelectPrev,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py
index acff259e503..7b280507bbb 100644
--- a/release/scripts/startup/bl_operators/node.py
+++ b/release/scripts/startup/bl_operators/node.py
@@ -295,3 +295,14 @@ class NODE_OT_tree_path_parent(Operator):
space.path.pop()
return {'FINISHED'}
+
+
+classes = (
+ NodeSetting,
+
+ NODE_OT_add_and_link_node,
+ NODE_OT_add_node,
+ NODE_OT_add_search,
+ NODE_OT_collapse_hide_unused_toggle,
+ NODE_OT_tree_path_parent,
+)
diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py
index be680a6df0c..f5190f0653d 100644
--- a/release/scripts/startup/bl_operators/object.py
+++ b/release/scripts/startup/bl_operators/object.py
@@ -1036,3 +1036,22 @@ class LodGenerate(Operator):
scene.objects.active = ob
return {'FINISHED'}
+
+
+classes = (
+ ClearAllRestrictRender,
+ DupliOffsetFromCursor,
+ IsolateTypeRender,
+ JoinUVs,
+ LodByName,
+ LodClearAll,
+ LodGenerate,
+ MakeDupliFace,
+ SelectCamera,
+ SelectHierarchy,
+ SelectPattern,
+ ShapeTransfer,
+ SubdivisionSet,
+ TransformsToDeltas,
+ TransformsToDeltasAnim,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/object_align.py b/release/scripts/startup/bl_operators/object_align.py
index a6ee16e6b71..a088898b14d 100644
--- a/release/scripts/startup/bl_operators/object_align.py
+++ b/release/scripts/startup/bl_operators/object_align.py
@@ -411,3 +411,8 @@ class AlignObjects(Operator):
return {'CANCELLED'}
else:
return {'FINISHED'}
+
+
+classes = (
+ AlignObjects,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py
index 0b9e7fd7305..57d7f03fcd4 100644
--- a/release/scripts/startup/bl_operators/object_quick_effects.py
+++ b/release/scripts/startup/bl_operators/object_quick_effects.py
@@ -645,3 +645,11 @@ class QuickFluid(Operator):
bpy.ops.fluid.bake('INVOKE_DEFAULT')
return {'FINISHED'}
+
+
+classes = (
+ QuickExplode,
+ QuickFluid,
+ QuickFur,
+ QuickSmoke,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/object_randomize_transform.py b/release/scripts/startup/bl_operators/object_randomize_transform.py
index 38110328603..f856b85844e 100644
--- a/release/scripts/startup/bl_operators/object_randomize_transform.py
+++ b/release/scripts/startup/bl_operators/object_randomize_transform.py
@@ -185,3 +185,8 @@ class RandomizeLocRotSize(Operator):
loc, rot, scale, scale_even, scale_min)
return {'FINISHED'}
+
+
+classes = (
+ RandomizeLocRotSize,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index cb332c18127..fdacf24f6e0 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -680,3 +680,26 @@ class AddPresetUnitsLength(AddPresetBase, Operator):
]
preset_subdir = "units_length"
+
+
+classes = (
+ AddPresetCamera,
+ AddPresetCloth,
+ AddPresetFluid,
+ AddPresetHairDynamics,
+ AddPresetInteraction,
+ AddPresetInterfaceTheme,
+ AddPresetKeyconfig,
+ AddPresetNodeColor,
+ AddPresetOperator,
+ AddPresetRender,
+ AddPresetSSS,
+ AddPresetSafeAreas,
+ AddPresetSunSky,
+ AddPresetTrackingCamera,
+ AddPresetTrackingSettings,
+ AddPresetTrackingTrackColor,
+ AddPresetUnitsLength,
+ ExecutePreset,
+ WM_MT_operator_presets,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/rigidbody.py b/release/scripts/startup/bl_operators/rigidbody.py
index cba49c629be..c2b057827f1 100644
--- a/release/scripts/startup/bl_operators/rigidbody.py
+++ b/release/scripts/startup/bl_operators/rigidbody.py
@@ -309,3 +309,10 @@ class ConnectRigidBodies(Operator):
else:
self.report({'WARNING'}, "No other objects selected")
return {'CANCELLED'}
+
+
+classes = (
+ BakeToKeyframes,
+ ConnectRigidBodies,
+ CopyRigidbodySettings,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/screen_play_rendered_anim.py b/release/scripts/startup/bl_operators/screen_play_rendered_anim.py
index a5565699364..f4d6c7065a9 100644
--- a/release/scripts/startup/bl_operators/screen_play_rendered_anim.py
+++ b/release/scripts/startup/bl_operators/screen_play_rendered_anim.py
@@ -180,3 +180,8 @@ class PlayRenderedAnim(Operator):
return {'CANCELLED'}
return {'FINISHED'}
+
+
+classes = (
+ PlayRenderedAnim,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/sequencer.py b/release/scripts/startup/bl_operators/sequencer.py
index 31ca4249a9d..7209b6b478f 100644
--- a/release/scripts/startup/bl_operators/sequencer.py
+++ b/release/scripts/startup/bl_operators/sequencer.py
@@ -134,3 +134,10 @@ class SequencerDeinterlaceSelectedMovies(Operator):
s.use_deinterlace = True
return {'FINISHED'}
+
+
+classes = (
+ SequencerCrossfadeSounds,
+ SequencerCutMulticam,
+ SequencerDeinterlaceSelectedMovies,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/uvcalc_follow_active.py b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
index d1ac9e0b586..25ee5cafe81 100644
--- a/release/scripts/startup/bl_operators/uvcalc_follow_active.py
+++ b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
@@ -248,3 +248,8 @@ class FollowActiveQuads(Operator):
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self)
+
+
+classes = (
+ FollowActiveQuads,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
index 3b095c883a3..8ee29d15d1b 100644
--- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py
+++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
@@ -668,3 +668,8 @@ class LightMapPack(Operator):
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self)
+
+
+classes = (
+ LightMapPack,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/uvcalc_smart_project.py b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
index 52e7b0e0ae4..1dd5b78d599 100644
--- a/release/scripts/startup/bl_operators/uvcalc_smart_project.py
+++ b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
@@ -1100,3 +1100,8 @@ class SmartProject(Operator):
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self)
+
+
+classes = (
+ SmartProject,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/vertexpaint_dirt.py b/release/scripts/startup/bl_operators/vertexpaint_dirt.py
index 892e1822d68..c006e8e6e92 100644
--- a/release/scripts/startup/bl_operators/vertexpaint_dirt.py
+++ b/release/scripts/startup/bl_operators/vertexpaint_dirt.py
@@ -182,3 +182,8 @@ class VertexPaintDirt(Operator):
ret = applyVertexDirt(mesh, self.blur_iterations, self.blur_strength, self.dirt_angle, self.clean_angle, self.dirt_only)
return ret
+
+
+classes = (
+ VertexPaintDirt,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/view3d.py b/release/scripts/startup/bl_operators/view3d.py
index df4a93bb87f..acec2d8fe91 100644
--- a/release/scripts/startup/bl_operators/view3d.py
+++ b/release/scripts/startup/bl_operators/view3d.py
@@ -213,3 +213,11 @@ class VIEW3D_OT_select_or_deselect_all(Operator):
enumerate=self.enumerate,
object=self.object,
location=(x, y))
+
+
+classes = (
+ VIEW3D_OT_edit_mesh_extrude_individual_move,
+ VIEW3D_OT_edit_mesh_extrude_move,
+ VIEW3D_OT_edit_mesh_extrude_shrink_fatten,
+ VIEW3D_OT_select_or_deselect_all,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index 869070ed778..42f1e723d1a 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -2192,3 +2192,58 @@ class WM_OT_addon_userpref_show(Operator):
bpy.ops.screen.userpref_show('INVOKE_DEFAULT')
return {'FINISHED'}
+
+
+classes = (
+ BRUSH_OT_active_index_set,
+ WM_OT_addon_disable,
+ WM_OT_addon_enable,
+ WM_OT_addon_expand,
+ WM_OT_addon_install,
+ WM_OT_addon_refresh,
+ WM_OT_addon_remove,
+ WM_OT_addon_userpref_show,
+ WM_OT_appconfig_activate,
+ WM_OT_appconfig_default,
+ WM_OT_blenderplayer_start,
+ WM_OT_context_collection_boolean_set,
+ WM_OT_context_cycle_array,
+ WM_OT_context_cycle_enum,
+ WM_OT_context_cycle_int,
+ WM_OT_context_menu_enum,
+ WM_OT_context_modal_mouse,
+ WM_OT_context_pie_enum,
+ WM_OT_context_scale_float,
+ WM_OT_context_scale_int,
+ WM_OT_context_set_boolean,
+ WM_OT_context_set_enum,
+ WM_OT_context_set_float,
+ WM_OT_context_set_id,
+ WM_OT_context_set_int,
+ WM_OT_context_set_string,
+ WM_OT_context_set_value,
+ WM_OT_context_toggle,
+ WM_OT_context_toggle_enum,
+ WM_OT_copy_prev_settings,
+ WM_OT_doc_view,
+ WM_OT_doc_view_manual,
+ WM_OT_keyconfig_activate,
+ WM_OT_keyconfig_export,
+ WM_OT_keyconfig_import,
+ WM_OT_keyconfig_remove,
+ WM_OT_keyconfig_test,
+ WM_OT_keyitem_add,
+ WM_OT_keyitem_remove,
+ WM_OT_keyitem_restore,
+ WM_OT_keymap_restore,
+ WM_OT_operator_cheat_sheet,
+ WM_OT_operator_pie_enum,
+ WM_OT_path_open,
+ WM_OT_properties_add,
+ WM_OT_properties_context_change,
+ WM_OT_properties_edit,
+ WM_OT_properties_remove,
+ WM_OT_sysinfo,
+ WM_OT_theme_install,
+ WM_OT_url_open,
+) \ No newline at end of file
diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py
index 7ce5733c6e2..2f91d3327cc 100644
--- a/release/scripts/startup/bl_ui/__init__.py
+++ b/release/scripts/startup/bl_ui/__init__.py
@@ -95,7 +95,10 @@ del _namespace
def register():
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for mod in _modules_loaded:
+ for cls in mod.classes:
+ register_class(cls)
# space_userprefs.py
from bpy.props import StringProperty, EnumProperty
@@ -144,8 +147,10 @@ def register():
def unregister():
- bpy.utils.unregister_module(__name__)
-
+ from bpy.utils import unregister_class
+ for mod in reversed(_modules_loaded):
+ for cls in reversed(mod.classes):
+ unregister_class(cls)
# Define a default UIList, when a list does not need any custom drawing...
# Keep in sync with its #defined name in UI_interface.h
diff --git a/release/scripts/startup/bl_ui/properties_animviz.py b/release/scripts/startup/bl_ui/properties_animviz.py
index 046b5eb2aa5..84bae18dd6f 100644
--- a/release/scripts/startup/bl_ui/properties_animviz.py
+++ b/release/scripts/startup/bl_ui/properties_animviz.py
@@ -139,6 +139,11 @@ class OnionSkinButtonsPanel:
col.label(text="Display:")
col.prop(arm, "show_only_ghost_selected", text="Selected Only")
+
+classes = (
+)
+
if __name__ == "__main__": # only for live edit.
- import bpy
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py
index 7cbdeb6e61d..ddfc656da08 100644
--- a/release/scripts/startup/bl_ui/properties_collection.py
+++ b/release/scripts/startup/bl_ui/properties_collection.py
@@ -134,5 +134,14 @@ class COLLECTION_PT_edit_mode_settings(CollectionButtonsPanel, Panel):
template_engine_settings(col, settings, "normals_length")
+classes = (
+ COLLECTION_PT_context_collection,
+ COLLECTION_PT_clay_settings,
+ COLLECTION_PT_object_mode_settings,
+ COLLECTION_PT_edit_mode_settings,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py
index cb5f1595ff3..00892d5f85b 100644
--- a/release/scripts/startup/bl_ui/properties_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_constraint.py
@@ -941,5 +941,12 @@ class BONE_PT_constraints(ConstraintButtonsPanel, Panel):
for con in context.pose_bone.constraints:
self.draw_constraint(context, con)
+classes = (
+ OBJECT_PT_constraints,
+ BONE_PT_constraints,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py
index 8261f0c7770..a2ecf984eb5 100644
--- a/release/scripts/startup/bl_ui/properties_data_armature.py
+++ b/release/scripts/startup/bl_ui/properties_data_armature.py
@@ -328,5 +328,21 @@ class DATA_PT_custom_props_arm(ArmatureButtonsPanel, PropertyPanel, Panel):
_context_path = "object.data"
_property_type = bpy.types.Armature
+
+classes = (
+ DATA_PT_context_arm,
+ DATA_PT_skeleton,
+ DATA_PT_display,
+ DATA_PT_bone_group_specials,
+ DATA_PT_bone_groups,
+ DATA_PT_pose_library,
+ DATA_PT_ghost,
+ DATA_PT_iksolver_itasc,
+ DATA_PT_motion_paths,
+ DATA_PT_custom_props_arm,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_bone.py b/release/scripts/startup/bl_ui/properties_data_bone.py
index 3a5475514c9..132c355ed99 100644
--- a/release/scripts/startup/bl_ui/properties_data_bone.py
+++ b/release/scripts/startup/bl_ui/properties_data_bone.py
@@ -449,5 +449,20 @@ class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, Panel):
else:
return "active_bone"
+
+classes = (
+ BONE_PT_context_bone,
+ BONE_PT_transform,
+ BONE_PT_transform_locks,
+ BONE_PT_curved,
+ BONE_PT_relations,
+ BONE_PT_display,
+ BONE_PT_inverse_kinematics,
+ BONE_PT_deform,
+ BONE_PT_custom_props,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index bb3945e5a3b..edab1c5b22f 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -325,5 +325,20 @@ def draw_display_safe_settings(layout, safe_data, settings):
col.prop(safe_data, "action_center", slider=True)
+classes = (
+ CAMERA_MT_presets,
+ SAFE_AREAS_MT_presets,
+ DATA_PT_context_camera,
+ DATA_PT_lens,
+ DATA_PT_camera,
+ DATA_PT_camera_stereoscopy,
+ DATA_PT_camera_dof,
+ DATA_PT_camera_display,
+ DATA_PT_camera_safe_areas,
+ DATA_PT_custom_props_camera,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_curve.py b/release/scripts/startup/bl_ui/properties_data_curve.py
index 33af812b6c4..ac1eb9505a6 100644
--- a/release/scripts/startup/bl_ui/properties_data_curve.py
+++ b/release/scripts/startup/bl_ui/properties_data_curve.py
@@ -431,5 +431,21 @@ class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, Panel):
_context_path = "object.data"
_property_type = bpy.types.Curve
+
+classes = (
+ DATA_PT_context_curve,
+ DATA_PT_shape_curve,
+ DATA_PT_curve_texture_space,
+ DATA_PT_geometry_curve,
+ DATA_PT_pathanim,
+ DATA_PT_active_spline,
+ DATA_PT_font,
+ DATA_PT_paragraph,
+ DATA_PT_text_boxes,
+ DATA_PT_custom_props_curve,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py
index a752d3517de..c66ff87ecbd 100644
--- a/release/scripts/startup/bl_ui/properties_data_empty.py
+++ b/release/scripts/startup/bl_ui/properties_data_empty.py
@@ -55,5 +55,12 @@ class DATA_PT_empty(DataButtonsPanel, Panel):
layout.prop(ob, "empty_draw_size", text="Size")
+
+classes = (
+ DATA_PT_empty,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_lamp.py b/release/scripts/startup/bl_ui/properties_data_lamp.py
index afc8a47419c..ab84eb8dd60 100644
--- a/release/scripts/startup/bl_ui/properties_data_lamp.py
+++ b/release/scripts/startup/bl_ui/properties_data_lamp.py
@@ -394,5 +394,21 @@ class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel, Panel):
_context_path = "object.data"
_property_type = bpy.types.Lamp
+
+classes = (
+ LAMP_MT_sunsky_presets,
+ DATA_PT_context_lamp,
+ DATA_PT_preview,
+ DATA_PT_lamp,
+ DATA_PT_sunsky,
+ DATA_PT_shadow,
+ DATA_PT_area,
+ DATA_PT_spot,
+ DATA_PT_falloff_curve,
+ DATA_PT_custom_props_lamp,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_lattice.py b/release/scripts/startup/bl_ui/properties_data_lattice.py
index cbfa6961e8c..4b3fd48c195 100644
--- a/release/scripts/startup/bl_ui/properties_data_lattice.py
+++ b/release/scripts/startup/bl_ui/properties_data_lattice.py
@@ -82,5 +82,14 @@ class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel, Panel):
_context_path = "object.data"
_property_type = bpy.types.Lattice
+
+classes = (
+ DATA_PT_context_lattice,
+ DATA_PT_lattice,
+ DATA_PT_custom_props_lattice,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index cbd86bb8860..3e90eacd547 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -392,5 +392,24 @@ class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, Panel):
_property_type = bpy.types.Mesh
+classes = (
+ MESH_MT_vertex_group_specials,
+ MESH_MT_shape_key_specials,
+ MESH_UL_vgroups,
+ MESH_UL_shape_keys,
+ MESH_UL_uvmaps_vcols,
+ DATA_PT_context_mesh,
+ DATA_PT_normals,
+ DATA_PT_texture_space,
+ DATA_PT_vertex_groups,
+ DATA_PT_shape_keys,
+ DATA_PT_uv_texture,
+ DATA_PT_vertex_colors,
+ DATA_PT_customdata,
+ DATA_PT_custom_props_mesh,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_metaball.py b/release/scripts/startup/bl_ui/properties_data_metaball.py
index b42258c386a..a621dc7210f 100644
--- a/release/scripts/startup/bl_ui/properties_data_metaball.py
+++ b/release/scripts/startup/bl_ui/properties_data_metaball.py
@@ -135,5 +135,16 @@ class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel, Panel):
_context_path = "object.data"
_property_type = bpy.types.MetaBall
+
+classes = (
+ DATA_PT_context_metaball,
+ DATA_PT_metaball,
+ DATA_PT_mball_texture_space,
+ DATA_PT_metaball_element,
+ DATA_PT_custom_props_metaball,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 68b6265ab15..a098953699e 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1522,5 +1522,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
layout.operator("object.correctivesmooth_bind", text="Unbind" if is_bind else "Bind")
+classes = (
+ DATA_PT_modifiers,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_speaker.py b/release/scripts/startup/bl_ui/properties_data_speaker.py
index 5ed0f8c3265..eecb2690302 100644
--- a/release/scripts/startup/bl_ui/properties_data_speaker.py
+++ b/release/scripts/startup/bl_ui/properties_data_speaker.py
@@ -121,5 +121,16 @@ class DATA_PT_custom_props_speaker(DataButtonsPanel, PropertyPanel, Panel):
_context_path = "object.data"
_property_type = bpy.types.Speaker
+
+classes = (
+ DATA_PT_context_speaker,
+ DATA_PT_speaker,
+ DATA_PT_distance,
+ DATA_PT_cone,
+ DATA_PT_custom_props_speaker,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_freestyle.py b/release/scripts/startup/bl_ui/properties_freestyle.py
index e0620447185..9c5be7624e0 100644
--- a/release/scripts/startup/bl_ui/properties_freestyle.py
+++ b/release/scripts/startup/bl_ui/properties_freestyle.py
@@ -828,5 +828,17 @@ class MATERIAL_PT_freestyle_line(MaterialFreestyleButtonsPanel, Panel):
row.prop(mat, "line_priority", text="Priority")
+classes = (
+ RENDER_PT_freestyle,
+ RENDERLAYER_UL_linesets,
+ RENDER_MT_lineset_specials,
+ RENDERLAYER_PT_freestyle,
+ RENDERLAYER_PT_freestyle_lineset,
+ RENDERLAYER_PT_freestyle_linestyle,
+ MATERIAL_PT_freestyle_line,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py
index ec061370fe5..46b34373aa5 100644
--- a/release/scripts/startup/bl_ui/properties_game.py
+++ b/release/scripts/startup/bl_ui/properties_game.py
@@ -852,5 +852,30 @@ class OBJECT_PT_levels_of_detail(ObjectButtonsPanel, Panel):
row.menu("OBJECT_MT_lod_tools", text="", icon='TRIA_DOWN')
+classes = (
+ PHYSICS_PT_game_physics,
+ PHYSICS_PT_game_collision_bounds,
+ PHYSICS_PT_game_obstacles,
+ RENDER_PT_embedded,
+ RENDER_PT_game_player,
+ RENDER_PT_game_stereo,
+ RENDER_PT_game_shading,
+ RENDER_PT_game_system,
+ RENDER_PT_game_display,
+ SCENE_PT_game_physics,
+ SCENE_PT_game_physics_obstacles,
+ SCENE_PT_game_navmesh,
+ SCENE_PT_game_hysteresis,
+ WORLD_PT_game_context_world,
+ WORLD_PT_game_world,
+ WORLD_PT_game_environment_lighting,
+ WORLD_PT_game_mist,
+ DATA_PT_shadow_game,
+ OBJECT_MT_lod_tools,
+ OBJECT_PT_levels_of_detail,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index 4529c127839..42e8d5272b3 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -1155,3 +1155,24 @@ class GreasePencilToolsPanel:
layout.separator()
gpencil_stroke_placement_settings(context, layout)
+
+
+classes = (
+ GPENCIL_PIE_tool_palette,
+ GPENCIL_PIE_settings_palette,
+ GPENCIL_PIE_tools_more,
+ GPENCIL_PIE_sculpt,
+ GPENCIL_MT_snap,
+ GPENCIL_MT_gpencil_edit_specials,
+ GPENCIL_UL_brush,
+ GPENCIL_UL_palettecolor,
+ GPENCIL_UL_layer,
+ GPENCIL_MT_layer_specials,
+ GPENCIL_MT_brush_specials,
+ GPENCIL_MT_palettecolor_specials,
+)
+
+if __name__ == "__main__": # only for live edit.
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_mask_common.py b/release/scripts/startup/bl_ui/properties_mask_common.py
index f4836da50bc..a7a67130f2f 100644
--- a/release/scripts/startup/bl_ui/properties_mask_common.py
+++ b/release/scripts/startup/bl_ui/properties_mask_common.py
@@ -392,5 +392,17 @@ class MASK_MT_select(Menu):
layout.operator("mask.select_all", text="Inverse").action = 'INVERT'
layout.operator("mask.select_linked", text="Select Linked")
+
+classes = (
+ MASK_UL_layers,
+ MASK_MT_mask,
+ MASK_MT_visibility,
+ MASK_MT_transform,
+ MASK_MT_animation,
+ MASK_MT_select,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py
index d916007ea41..c384600344e 100644
--- a/release/scripts/startup/bl_ui/properties_material.py
+++ b/release/scripts/startup/bl_ui/properties_material.py
@@ -1052,5 +1052,38 @@ class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, Panel):
_context_path = "material"
_property_type = bpy.types.Material
+
+classes = (
+ MATERIAL_MT_sss_presets,
+ MATERIAL_MT_specials,
+ MATERIAL_UL_matslots,
+ MATERIAL_PT_context_material,
+ MATERIAL_PT_preview,
+ MATERIAL_PT_pipeline,
+ MATERIAL_PT_diffuse,
+ MATERIAL_PT_specular,
+ MATERIAL_PT_shading,
+ MATERIAL_PT_transp,
+ MATERIAL_PT_mirror,
+ MATERIAL_PT_sss,
+ MATERIAL_PT_halo,
+ MATERIAL_PT_flare,
+ MATERIAL_PT_game_settings,
+ MATERIAL_PT_physics,
+ MATERIAL_PT_strand,
+ MATERIAL_PT_options,
+ MATERIAL_PT_shadow,
+ MATERIAL_PT_transp_game,
+ MATERIAL_PT_volume_density,
+ MATERIAL_PT_volume_shading,
+ MATERIAL_PT_volume_lighting,
+ MATERIAL_PT_volume_transp,
+ MATERIAL_PT_volume_integration,
+ MATERIAL_PT_volume_options,
+ MATERIAL_PT_custom_props,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index 4a596981983..d7e18f81232 100644
--- a/release/scripts/startup/bl_ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -366,5 +366,23 @@ class OBJECT_PT_custom_props(ObjectButtonsPanel, PropertyPanel, Panel):
_context_path = "object"
_property_type = bpy.types.Object
+
+classes = (
+ OBJECT_PT_context_object,
+ OBJECT_PT_transform,
+ OBJECT_PT_delta_transform,
+ OBJECT_PT_transform_locks,
+ OBJECT_PT_relations,
+ OBJECT_PT_relations_extras,
+ GROUP_MT_specials,
+ OBJECT_PT_groups,
+ OBJECT_PT_display,
+ OBJECT_PT_duplication,
+ OBJECT_PT_motion_paths,
+ OBJECT_PT_custom_props,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index 09a3a19cbce..dfd20d90ec4 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -309,3 +309,13 @@ def brush_mask_texture_settings(layout, brush):
split = layout.split()
split.prop(mask_tex_slot, "offset")
split.prop(mask_tex_slot, "scale")
+
+
+classes = (
+ VIEW3D_MT_tools_projectpaint_clone,
+)
+
+if __name__ == "__main__": # only for live edit.
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index 29fc56c3fad..593312fc071 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -1404,5 +1404,29 @@ class PARTICLE_PT_custom_props(ParticleButtonsPanel, PropertyPanel, Panel):
_context_path = "particle_system.settings"
_property_type = bpy.types.ParticleSettings
+
+classes = (
+ PARTICLE_MT_specials,
+ PARTICLE_MT_hair_dynamics_presets,
+ PARTICLE_UL_particle_systems,
+ PARTICLE_PT_context_particles,
+ PARTICLE_PT_emission,
+ PARTICLE_PT_hair_dynamics,
+ PARTICLE_PT_cache,
+ PARTICLE_PT_velocity,
+ PARTICLE_PT_rotation,
+ PARTICLE_PT_physics,
+ PARTICLE_PT_boidbrain,
+ PARTICLE_PT_render,
+ PARTICLE_PT_draw,
+ PARTICLE_PT_children,
+ PARTICLE_PT_field_weights,
+ PARTICLE_PT_force_fields,
+ PARTICLE_PT_vertexgroups,
+ PARTICLE_PT_custom_props,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_cloth.py b/release/scripts/startup/bl_ui/properties_physics_cloth.py
index 54581c9276d..6ada3c59942 100644
--- a/release/scripts/startup/bl_ui/properties_physics_cloth.py
+++ b/release/scripts/startup/bl_ui/properties_physics_cloth.py
@@ -258,5 +258,17 @@ class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel, Panel):
cloth = context.cloth.settings
effector_weights_ui(self, context, cloth.effector_weights, 'CLOTH')
+classes = (
+ CLOTH_MT_presets,
+ PHYSICS_PT_cloth,
+ PHYSICS_PT_cloth_cache,
+ PHYSICS_PT_cloth_collision,
+ PHYSICS_PT_cloth_stiffness,
+ PHYSICS_PT_cloth_sewing,
+ PHYSICS_PT_cloth_field_weights,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_common.py b/release/scripts/startup/bl_ui/properties_physics_common.py
index 4478c6a4379..0b98d8738dc 100644
--- a/release/scripts/startup/bl_ui/properties_physics_common.py
+++ b/release/scripts/startup/bl_ui/properties_physics_common.py
@@ -318,5 +318,12 @@ def basic_force_field_falloff_ui(self, context, field):
sub.active = field.use_max_distance
sub.prop(field, "distance_max", text="Maximum")
+
+classes = (
+ PHYSICS_PT_add,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
index 6c3a3246cf6..c813350be08 100644
--- a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
+++ b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
@@ -529,12 +529,20 @@ class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, Panel):
row.prop(brush, "wave_clamp")
-def register():
- bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.register_module(__name__)
-
-if __name__ == "__main__":
- register()
+classes = (
+ PHYSICS_UL_dynapaint_surfaces,
+ PHYSICS_PT_dynamic_paint,
+ PHYSICS_PT_dp_advanced_canvas,
+ PHYSICS_PT_dp_canvas_output,
+ PHYSICS_PT_dp_canvas_initial_color,
+ PHYSICS_PT_dp_effects,
+ PHYSICS_PT_dp_cache,
+ PHYSICS_PT_dp_brush_source,
+ PHYSICS_PT_dp_brush_velocity,
+ PHYSICS_PT_dp_brush_wave,
+)
+
+if __name__ == "__main__": # only for live edit.
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_field.py b/release/scripts/startup/bl_ui/properties_physics_field.py
index 1cebc0496b0..2b12fcf982d 100644
--- a/release/scripts/startup/bl_ui/properties_physics_field.py
+++ b/release/scripts/startup/bl_ui/properties_physics_field.py
@@ -228,5 +228,13 @@ class PHYSICS_PT_collision(PhysicButtonsPanel, Panel):
col.label(text="Force Fields:")
col.prop(settings, "absorption", text="Absorption")
+
+classes = (
+ PHYSICS_PT_field,
+ PHYSICS_PT_collision,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py
index 5d7034c2e68..ab92370f9ae 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -308,5 +308,16 @@ class PHYSICS_PT_domain_particles(PhysicButtonsPanel, Panel):
row.prop(fluid, "tracer_particles", text="Tracer")
row.prop(fluid, "generate_particles", text="Generate")
+
+classes = (
+ FLUID_MT_presets,
+ PHYSICS_PT_fluid,
+ PHYSICS_PT_domain_gravity,
+ PHYSICS_PT_domain_boundary,
+ PHYSICS_PT_domain_particles,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
index eeb21c046bf..6afdd800b88 100644
--- a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
@@ -137,5 +137,14 @@ class PHYSICS_PT_rigid_body_dynamics(PHYSICS_PT_rigidbody_panel, Panel):
col.prop(rbo, "linear_damping", text="Translation")
col.prop(rbo, "angular_damping", text="Rotation")
+
+classes = (
+ PHYSICS_PT_rigid_body,
+ PHYSICS_PT_rigid_body_collisions,
+ PHYSICS_PT_rigid_body_dynamics,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py b/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
index 9d4f51b256b..84a4cbb4b68 100644
--- a/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
@@ -260,5 +260,11 @@ class PHYSICS_PT_rigid_body_constraint(PHYSICS_PT_rigidbody_constraint_panel, Pa
sub.prop(rbc, "spring_damping_ang_z", text="Damping")
+classes = (
+ PHYSICS_PT_rigid_body_constraint,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py
index ee9135b9dbf..e6182c2ec74 100644
--- a/release/scripts/startup/bl_ui/properties_physics_smoke.py
+++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py
@@ -410,5 +410,19 @@ class PHYSICS_PT_smoke_display_settings(PhysicButtonsPanel, Panel):
col.template_color_ramp(domain, "color_ramp", expand=True)
+classes = (
+ PHYSICS_PT_smoke,
+ PHYSICS_PT_smoke_flow_advanced,
+ PHYSICS_PT_smoke_fire,
+ PHYSICS_PT_smoke_adaptive_domain,
+ PHYSICS_PT_smoke_highres,
+ PHYSICS_PT_smoke_groups,
+ PHYSICS_PT_smoke_cache,
+ PHYSICS_PT_smoke_field_weights,
+ PHYSICS_PT_smoke_display_settings,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_physics_softbody.py b/release/scripts/startup/bl_ui/properties_physics_softbody.py
index a458af739f2..5960428e4ae 100644
--- a/release/scripts/startup/bl_ui/properties_physics_softbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_softbody.py
@@ -244,5 +244,18 @@ class PHYSICS_PT_softbody_field_weights(PhysicButtonsPanel, Panel):
effector_weights_ui(self, context, softbody.effector_weights, 'SOFTBODY')
+
+classes = (
+ PHYSICS_PT_softbody,
+ PHYSICS_PT_softbody_cache,
+ PHYSICS_PT_softbody_goal,
+ PHYSICS_PT_softbody_edge,
+ PHYSICS_PT_softbody_collision,
+ PHYSICS_PT_softbody_solver,
+ PHYSICS_PT_softbody_field_weights,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 90d46a6ee47..43c89a32a52 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -603,5 +603,25 @@ class RENDER_PT_clay(RenderButtonsPanel, Panel):
layout.prop(settings, "ssao_samples")
+classes = (
+ RENDER_MT_presets,
+ RENDER_MT_ffmpeg_presets,
+ RENDER_MT_framerate_presets,
+ RENDER_PT_render,
+ RENDER_PT_dimensions,
+ RENDER_PT_antialiasing,
+ RENDER_PT_motion_blur,
+ RENDER_PT_shading,
+ RENDER_PT_performance,
+ RENDER_PT_post_processing,
+ RENDER_PT_stamp,
+ RENDER_PT_output,
+ RENDER_PT_encoding,
+ RENDER_PT_bake,
+ RENDER_PT_clay,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index 2545eadc792..d6905cd1975 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -130,5 +130,14 @@ class RENDERLAYER_PT_views(RenderLayerButtonsPanel, Panel):
row.prop(rv, "camera_suffix", text="")
+classes = (
+ RENDERLAYER_UL_renderlayers,
+ RENDERLAYER_PT_layers,
+ RENDERLAYER_UL_renderviews,
+ RENDERLAYER_PT_views,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index d6253ec7fbc..fb93c0b56f2 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -443,5 +443,25 @@ class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
_context_path = "scene"
_property_type = bpy.types.Scene
+
+classes = (
+ SCENE_MT_units_length_presets,
+ SCENE_UL_keying_set_paths,
+ SCENE_PT_scene,
+ SCENE_PT_unit,
+ SCENE_PT_keying_sets,
+ SCENE_PT_keying_set_paths,
+ SCENE_PT_color_management,
+ SCENE_PT_audio,
+ SCENE_PT_physics,
+ SCENE_PT_rigid_body_world,
+ SCENE_PT_rigid_body_cache,
+ SCENE_PT_rigid_body_field_weights,
+ SCENE_PT_simplify,
+ SCENE_PT_custom_props,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py
index caf19a9e469..caeccb9bb9d 100644
--- a/release/scripts/startup/bl_ui/properties_texture.py
+++ b/release/scripts/startup/bl_ui/properties_texture.py
@@ -1224,5 +1224,38 @@ class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, Panel):
_context_path = "texture"
_property_type = Texture
+
+classes = (
+ TEXTURE_MT_specials,
+ TEXTURE_MT_envmap_specials,
+ TEXTURE_UL_texslots,
+ TEXTURE_PT_context_texture,
+ TEXTURE_PT_preview,
+ TEXTURE_PT_colors,
+ TEXTURE_PT_clouds,
+ TEXTURE_PT_wood,
+ TEXTURE_PT_marble,
+ TEXTURE_PT_magic,
+ TEXTURE_PT_blend,
+ TEXTURE_PT_stucci,
+ TEXTURE_PT_image,
+ TEXTURE_PT_image_sampling,
+ TEXTURE_PT_image_mapping,
+ TEXTURE_PT_envmap,
+ TEXTURE_PT_envmap_sampling,
+ TEXTURE_PT_musgrave,
+ TEXTURE_PT_voronoi,
+ TEXTURE_PT_distortednoise,
+ TEXTURE_PT_voxeldata,
+ TEXTURE_PT_pointdensity,
+ TEXTURE_PT_pointdensity_turbulence,
+ TEXTURE_PT_ocean,
+ TEXTURE_PT_mapping,
+ TEXTURE_PT_influence,
+ TEXTURE_PT_custom_props,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_world.py b/release/scripts/startup/bl_ui/properties_world.py
index e07349a99ee..6aa39580d34 100644
--- a/release/scripts/startup/bl_ui/properties_world.py
+++ b/release/scripts/startup/bl_ui/properties_world.py
@@ -248,5 +248,20 @@ class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel, Panel):
_context_path = "world"
_property_type = bpy.types.World
+
+classes = (
+ WORLD_PT_context_world,
+ WORLD_PT_preview,
+ WORLD_PT_world,
+ WORLD_PT_ambient_occlusion,
+ WORLD_PT_environment_lighting,
+ WORLD_PT_indirect_lighting,
+ WORLD_PT_gather,
+ WORLD_PT_mist,
+ WORLD_PT_custom_props,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index 5cc135392c1..3f05620fcf6 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -1486,5 +1486,69 @@ class CLIP_MT_stabilize_2d_rotation_specials(Menu):
layout.operator("clip.stabilize_2d_rotation_select")
+classes = (
+ CLIP_UL_tracking_objects,
+ CLIP_HT_header,
+ CLIP_MT_track,
+ CLIP_MT_tracking_editor_menus,
+ CLIP_MT_masking_editor_menus,
+ CLIP_PT_track,
+ CLIP_PT_tools_clip,
+ CLIP_PT_tools_marker,
+ CLIP_PT_tracking_settings,
+ CLIP_PT_tools_tracking,
+ CLIP_PT_tools_plane_tracking,
+ CLIP_PT_tools_solve,
+ CLIP_PT_tools_cleanup,
+ CLIP_PT_tools_geometry,
+ CLIP_PT_tools_orientation,
+ CLIP_PT_tools_object,
+ CLIP_PT_objects,
+ CLIP_PT_plane_track,
+ CLIP_PT_track_settings,
+ CLIP_PT_tracking_camera,
+ CLIP_PT_tracking_lens,
+ CLIP_PT_display,
+ CLIP_PT_marker,
+ CLIP_PT_marker_display,
+ CLIP_PT_stabilization,
+ CLIP_PT_proxy,
+ CLIP_PT_mask,
+ CLIP_PT_mask_layers,
+ CLIP_PT_mask_display,
+ CLIP_PT_active_mask_spline,
+ CLIP_PT_active_mask_point,
+ CLIP_PT_tools_mask,
+ CLIP_PT_tools_mask_add,
+ CLIP_PT_tools_mask_transforms,
+ CLIP_PT_footage,
+ CLIP_PT_footage_info,
+ CLIP_PT_tools_scenesetup,
+ CLIP_PT_grease_pencil,
+ CLIP_PT_grease_pencil_palettecolor,
+ CLIP_PT_tools_grease_pencil_draw,
+ CLIP_PT_tools_grease_pencil_edit,
+ CLIP_PT_tools_grease_pencil_sculpt,
+ CLIP_PT_tools_grease_pencil_brush,
+ CLIP_PT_tools_grease_pencil_brushcurves,
+ CLIP_MT_view,
+ CLIP_MT_clip,
+ CLIP_MT_proxy,
+ CLIP_MT_reconstruction,
+ CLIP_MT_track_visibility,
+ CLIP_MT_track_transform,
+ CLIP_MT_select,
+ CLIP_MT_select_grouped,
+ CLIP_MT_tracking_specials,
+ CLIP_MT_camera_presets,
+ CLIP_MT_track_color_presets,
+ CLIP_MT_tracking_settings_presets,
+ CLIP_MT_track_color_specials,
+ CLIP_MT_stabilize_2d_specials,
+ CLIP_MT_stabilize_2d_rotation_specials,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_console.py b/release/scripts/startup/bl_ui/space_console.py
index 4266abc5ad7..e6f96d989c7 100644
--- a/release/scripts/startup/bl_ui/space_console.py
+++ b/release/scripts/startup/bl_ui/space_console.py
@@ -102,5 +102,15 @@ def add_scrollback(text, text_type):
bpy.ops.console.scrollback_append(text=l.expandtabs(4),
type=text_type)
+
+classes = (
+ CONSOLE_HT_header,
+ CONSOLE_MT_editor_menus,
+ CONSOLE_MT_console,
+ CONSOLE_MT_language,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py
index 4d365c8dc08..e02649219dd 100644
--- a/release/scripts/startup/bl_ui/space_dopesheet.py
+++ b/release/scripts/startup/bl_ui/space_dopesheet.py
@@ -449,5 +449,21 @@ class DOPESHEET_MT_delete(Menu):
layout.operator("action.clean", text="Clean Channels").channels = True
+classes = (
+ DOPESHEET_HT_header,
+ DOPESHEET_MT_editor_menus,
+ DOPESHEET_MT_view,
+ DOPESHEET_MT_select,
+ DOPESHEET_MT_marker,
+ DOPESHEET_MT_channel,
+ DOPESHEET_MT_key,
+ DOPESHEET_MT_key_transform,
+ DOPESHEET_MT_gpencil_channel,
+ DOPESHEET_MT_gpencil_frame,
+ DOPESHEET_MT_delete,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index d7b93dc36f0..bd72dfa9370 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -247,5 +247,18 @@ class FILEBROWSER_PT_advanced_filter(Panel):
col.prop(params, "filter_id")
+classes = (
+ FILEBROWSER_HT_header,
+ FILEBROWSER_UL_dir,
+ FILEBROWSER_PT_system_folders,
+ FILEBROWSER_PT_system_bookmarks,
+ FILEBROWSER_MT_bookmarks_specials,
+ FILEBROWSER_PT_bookmarks,
+ FILEBROWSER_PT_recent_folders,
+ FILEBROWSER_PT_advanced_filter,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py
index cec3b26f35a..21b49df61ae 100644
--- a/release/scripts/startup/bl_ui/space_graph.py
+++ b/release/scripts/startup/bl_ui/space_graph.py
@@ -299,6 +299,19 @@ class GRAPH_MT_delete(Menu):
layout.operator("graph.clean").channels = False
layout.operator("graph.clean", text="Clean Channels").channels = True
+classes = (
+ GRAPH_HT_header,
+ GRAPH_MT_editor_menus,
+ GRAPH_MT_view,
+ GRAPH_MT_select,
+ GRAPH_MT_marker,
+ GRAPH_MT_channel,
+ GRAPH_MT_key,
+ GRAPH_MT_key_transform,
+ GRAPH_MT_delete,
+)
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 04b4cef9512..b274657b4f4 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -1242,5 +1242,59 @@ class IMAGE_PT_tools_grease_pencil_brushcurves(GreasePencilBrushCurvesPanel, Pan
bl_space_type = 'IMAGE_EDITOR'
+classes = (
+ IMAGE_MT_view,
+ IMAGE_MT_select,
+ IMAGE_MT_brush,
+ IMAGE_MT_image,
+ IMAGE_MT_image_invert,
+ IMAGE_MT_uvs,
+ IMAGE_MT_uvs_showhide,
+ IMAGE_MT_uvs_proportional,
+ IMAGE_MT_uvs_transform,
+ IMAGE_MT_uvs_snap,
+ IMAGE_MT_uvs_mirror,
+ IMAGE_MT_uvs_weldalign,
+ IMAGE_MT_uvs_select_mode,
+ IMAGE_HT_header,
+ MASK_MT_editor_menus,
+ IMAGE_PT_mask,
+ IMAGE_PT_mask_layers,
+ IMAGE_PT_mask_display,
+ IMAGE_PT_active_mask_spline,
+ IMAGE_PT_active_mask_point,
+ IMAGE_PT_image_properties,
+ IMAGE_PT_game_properties,
+ IMAGE_PT_view_properties,
+ IMAGE_PT_tools_transform_uvs,
+ IMAGE_PT_paint,
+ IMAGE_PT_tools_brush_overlay,
+ IMAGE_PT_tools_brush_texture,
+ IMAGE_PT_tools_mask,
+ IMAGE_PT_tools_mask_texture,
+ IMAGE_PT_tools_brush_tool,
+ IMAGE_PT_paint_stroke,
+ IMAGE_PT_paint_curve,
+ IMAGE_PT_tools_imagepaint_symmetry,
+ IMAGE_PT_tools_brush_appearance,
+ IMAGE_PT_tools_paint_options,
+ IMAGE_UV_sculpt,
+ IMAGE_UV_sculpt_curve,
+ IMAGE_PT_view_histogram,
+ IMAGE_PT_view_waveform,
+ IMAGE_PT_view_vectorscope,
+ IMAGE_PT_sample_line,
+ IMAGE_PT_scope_sample,
+ IMAGE_PT_grease_pencil,
+ IMAGE_PT_grease_pencil_palettecolor,
+ IMAGE_PT_tools_grease_pencil_draw,
+ IMAGE_PT_tools_grease_pencil_edit,
+ IMAGE_PT_tools_grease_pencil_sculpt,
+ IMAGE_PT_tools_grease_pencil_brush,
+ IMAGE_PT_tools_grease_pencil_brushcurves,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py
index 743832eb51f..189160c2fde 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -340,5 +340,23 @@ class INFO_MT_help(Menu):
layout.operator("wm.splash", icon='BLENDER')
+
+classes = (
+ INFO_HT_header,
+ INFO_MT_editor_menus,
+ INFO_MT_file,
+ INFO_MT_file_import,
+ INFO_MT_file_export,
+ INFO_MT_file_external_data,
+ INFO_MT_file_previews,
+ INFO_MT_game,
+ INFO_MT_render,
+ INFO_MT_opengl_render,
+ INFO_MT_window,
+ INFO_MT_help,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_logic.py b/release/scripts/startup/bl_ui/space_logic.py
index 1b316a3eede..b552181f491 100644
--- a/release/scripts/startup/bl_ui/space_logic.py
+++ b/release/scripts/startup/bl_ui/space_logic.py
@@ -130,5 +130,16 @@ class LOGIC_MT_view(Menu):
layout.operator("screen.screen_full_area")
layout.operator("screen.screen_full_area", text="Toggle Fullscreen Area").use_hide_panels = True
+
+classes = (
+ LOGIC_PT_properties,
+ LOGIC_MT_logicbricks_add,
+ LOGIC_HT_header,
+ LOGIC_MT_editor_menus,
+ LOGIC_MT_view,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py
index 8fbf9bfc6ac..65d020477dc 100644
--- a/release/scripts/startup/bl_ui/space_nla.py
+++ b/release/scripts/startup/bl_ui/space_nla.py
@@ -209,5 +209,19 @@ class NLA_MT_edit_transform(Menu):
layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND'
layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE'
+
+classes = (
+ NLA_HT_header,
+ NLA_MT_edit,
+ NLA_MT_editor_menus,
+ NLA_MT_view,
+ NLA_MT_select,
+ NLA_MT_marker,
+ NLA_MT_add,
+ NLA_MT_edit_transform,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index 8821fa0ca58..b939d34e154 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -526,6 +526,33 @@ class NODE_PT_tools_grease_pencil_brushcurves(GreasePencilBrushCurvesPanel, Pane
def node_draw_tree_view(layout, context):
pass
+classes = (
+ NODE_HT_header,
+ NODE_MT_editor_menus,
+ NODE_MT_add,
+ NODE_MT_view,
+ NODE_MT_select,
+ NODE_MT_node,
+ NODE_MT_node_color_presets,
+ NODE_MT_node_color_specials,
+ NODE_PT_active_node_generic,
+ NODE_PT_active_node_color,
+ NODE_PT_active_node_properties,
+ NODE_PT_backdrop,
+ NODE_PT_quality,
+ NODE_UL_interface_sockets,
+ NODE_PT_grease_pencil,
+ NODE_PT_grease_pencil_palettecolor,
+ NODE_PT_grease_pencil_tools,
+ NODE_PT_tools_grease_pencil_draw,
+ NODE_PT_tools_grease_pencil_edit,
+ NODE_PT_tools_grease_pencil_sculpt,
+ NODE_PT_tools_grease_pencil_brush,
+ NODE_PT_tools_grease_pencil_brushcurves,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py
index 1e38338e361..054a955ab9c 100644
--- a/release/scripts/startup/bl_ui/space_outliner.py
+++ b/release/scripts/startup/bl_ui/space_outliner.py
@@ -141,5 +141,16 @@ class OUTLINER_MT_edit_datablocks(Menu):
layout.operator("outliner.drivers_add_selected")
layout.operator("outliner.drivers_delete_selected")
+
+classes = (
+ OUTLINER_HT_header,
+ OUTLINER_MT_editor_menus,
+ OUTLINER_MT_view,
+ OUTLINER_MT_search,
+ OUTLINER_MT_edit_datablocks,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_properties.py b/release/scripts/startup/bl_ui/space_properties.py
index f0ca01ec3ba..20cb5719e20 100644
--- a/release/scripts/startup/bl_ui/space_properties.py
+++ b/release/scripts/startup/bl_ui/space_properties.py
@@ -34,13 +34,11 @@ class PROPERTIES_HT_header(Header):
row.prop(view, "context", expand=True, icon_only=True)
-def register():
- bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-
-if __name__ == "__main__":
- register()
+classes = (
+ PROPERTIES_HT_header,
+)
+
+if __name__ == "__main__": # only for live edit.
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index 67ffaa7fccf..01da3b48f7d 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -1239,5 +1239,37 @@ class SEQUENCER_PT_custom_props(SequencerButtonsPanel, PropertyPanel, Panel):
bl_category = "Strip"
+classes = (
+ SEQUENCER_HT_header,
+ SEQUENCER_MT_editor_menus,
+ SEQUENCER_MT_view,
+ SEQUENCER_MT_view_toggle,
+ SEQUENCER_MT_select,
+ SEQUENCER_MT_marker,
+ SEQUENCER_MT_change,
+ SEQUENCER_MT_frame,
+ SEQUENCER_MT_add,
+ SEQUENCER_MT_add_effect,
+ SEQUENCER_MT_strip,
+ SEQUENCER_PT_edit,
+ SEQUENCER_PT_effect,
+ SEQUENCER_PT_input,
+ SEQUENCER_PT_sound,
+ SEQUENCER_PT_scene,
+ SEQUENCER_PT_mask,
+ SEQUENCER_PT_filter,
+ SEQUENCER_PT_proxy,
+ SEQUENCER_PT_preview,
+ SEQUENCER_PT_view,
+ SEQUENCER_PT_view_safe_areas,
+ SEQUENCER_PT_modifiers,
+ SEQUENCER_PT_grease_pencil,
+ SEQUENCER_PT_grease_pencil_palettecolor,
+ SEQUENCER_PT_grease_pencil_tools,
+ SEQUENCER_PT_custom_props,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_text.py b/release/scripts/startup/bl_ui/space_text.py
index 8c5418161ca..98a7da855ca 100644
--- a/release/scripts/startup/bl_ui/space_text.py
+++ b/release/scripts/startup/bl_ui/space_text.py
@@ -343,5 +343,25 @@ class TEXT_MT_toolbox(Menu):
layout.operator("text.run_script")
+
+classes = (
+ TEXT_HT_header,
+ TEXT_MT_edit,
+ TEXT_MT_editor_menus,
+ TEXT_PT_properties,
+ TEXT_PT_find,
+ TEXT_MT_view,
+ TEXT_MT_text,
+ TEXT_MT_templates,
+ TEXT_MT_templates_py,
+ TEXT_MT_templates_osl,
+ TEXT_MT_edit_select,
+ TEXT_MT_format,
+ TEXT_MT_edit_to3d,
+ TEXT_MT_toolbox,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py
index 1f62d8d6968..b9a25cd72a0 100644
--- a/release/scripts/startup/bl_ui/space_time.py
+++ b/release/scripts/startup/bl_ui/space_time.py
@@ -269,5 +269,18 @@ def marker_menu_generic(layout):
layout.prop(ts, "lock_markers")
+classes = (
+ TIME_HT_header,
+ TIME_MT_editor_menus,
+ TIME_MT_marker,
+ TIME_MT_view,
+ TIME_MT_cache,
+ TIME_MT_frame,
+ TIME_MT_playback,
+ TIME_MT_autokey,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index cd12255c24c..fe126f6522c 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -1320,7 +1320,7 @@ class USERPREF_PT_addons(Panel):
if addon_utils.error_duplicates:
box = col.box()
row = box.row()
- row.label("Multiple addons with the same name found!")
+ row.label("Multiple add-ons with the same name found!")
row.label(icon='ERROR')
box.label("Please delete one of each pair:")
for (addon_name, addon_file, addon_path) in addon_utils.error_duplicates:
@@ -1481,5 +1481,27 @@ class USERPREF_PT_addons(Panel):
row.label(text=module_name, translate=False)
+classes = (
+ USERPREF_HT_header,
+ USERPREF_PT_tabs,
+ USERPREF_MT_interaction_presets,
+ USERPREF_MT_appconfigs,
+ USERPREF_MT_splash,
+ USERPREF_MT_splash_footer,
+ USERPREF_PT_interface,
+ USERPREF_PT_edit,
+ USERPREF_PT_system,
+ USERPREF_MT_interface_theme_presets,
+ USERPREF_PT_theme,
+ USERPREF_PT_file,
+ USERPREF_MT_ndof_settings,
+ USERPREF_MT_keyconfigs,
+ USERPREF_PT_input,
+ USERPREF_MT_addons_online_resources,
+ USERPREF_PT_addons,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index bc90b754da8..aca73aadaee 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3811,13 +3811,142 @@ class VIEW3D_PT_context_properties(Panel):
# Draw with no edit button
rna_prop_ui.draw(self.layout, context, member, object, False)
-
-def register():
- bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
+classes = (
+ VIEW3D_HT_header,
+ VIEW3D_MT_editor_menus,
+ VIEW3D_MT_transform,
+ VIEW3D_MT_transform_base,
+ VIEW3D_MT_transform_object,
+ VIEW3D_MT_transform_armature,
+ VIEW3D_MT_mirror,
+ VIEW3D_MT_snap,
+ VIEW3D_MT_uv_map,
+ VIEW3D_MT_edit_proportional,
+ VIEW3D_MT_view,
+ VIEW3D_MT_view_navigation,
+ VIEW3D_MT_view_align,
+ VIEW3D_MT_view_align_selected,
+ VIEW3D_MT_view_cameras,
+ VIEW3D_MT_select_object,
+ VIEW3D_MT_select_object_more_less,
+ VIEW3D_MT_select_pose,
+ VIEW3D_MT_select_pose_more_less,
+ VIEW3D_MT_select_particle,
+ VIEW3D_MT_edit_mesh,
+ VIEW3D_MT_edit_mesh_select_similar,
+ VIEW3D_MT_edit_mesh_select_by_trait,
+ VIEW3D_MT_edit_mesh_select_more_less,
+ VIEW3D_MT_select_edit_mesh,
+ VIEW3D_MT_select_edit_curve,
+ VIEW3D_MT_select_edit_surface,
+ VIEW3D_MT_select_edit_text,
+ VIEW3D_MT_select_edit_metaball,
+ VIEW3D_MT_select_edit_lattice,
+ VIEW3D_MT_select_edit_armature,
+ VIEW3D_MT_select_gpencil,
+ VIEW3D_MT_select_paint_mask,
+ VIEW3D_MT_select_paint_mask_vertex,
+ VIEW3D_MT_angle_control,
+ INFO_MT_mesh_add,
+ INFO_MT_curve_add,
+ INFO_MT_surface_add,
+ INFO_MT_metaball_add,
+ INFO_MT_edit_curve_add,
+ INFO_MT_edit_armature_add,
+ INFO_MT_armature_add,
+ INFO_MT_lamp_add,
+ INFO_MT_add,
+ VIEW3D_MT_object,
+ VIEW3D_MT_object_animation,
+ VIEW3D_MT_object_clear,
+ VIEW3D_MT_object_specials,
+ VIEW3D_MT_object_apply,
+ VIEW3D_MT_object_parent,
+ VIEW3D_MT_object_track,
+ VIEW3D_MT_object_group,
+ VIEW3D_MT_object_constraints,
+ VIEW3D_MT_object_quick_effects,
+ VIEW3D_MT_make_single_user,
+ VIEW3D_MT_make_links,
+ VIEW3D_MT_object_game,
+ VIEW3D_MT_brush,
+ VIEW3D_MT_brush_paint_modes,
+ VIEW3D_MT_paint_vertex,
+ VIEW3D_MT_hook,
+ VIEW3D_MT_vertex_group,
+ VIEW3D_MT_paint_weight,
+ VIEW3D_MT_sculpt,
+ VIEW3D_MT_hide_mask,
+ VIEW3D_MT_particle,
+ VIEW3D_MT_particle_specials,
+ VIEW3D_MT_particle_showhide,
+ VIEW3D_MT_pose,
+ VIEW3D_MT_pose_transform,
+ VIEW3D_MT_pose_slide,
+ VIEW3D_MT_pose_propagate,
+ VIEW3D_MT_pose_library,
+ VIEW3D_MT_pose_motion,
+ VIEW3D_MT_pose_group,
+ VIEW3D_MT_pose_ik,
+ VIEW3D_MT_pose_constraints,
+ VIEW3D_MT_pose_showhide,
+ VIEW3D_MT_pose_apply,
+ VIEW3D_MT_pose_specials,
+ VIEW3D_MT_bone_options_toggle,
+ VIEW3D_MT_bone_options_enable,
+ VIEW3D_MT_bone_options_disable,
+ VIEW3D_MT_edit_mesh_specials,
+ VIEW3D_MT_edit_mesh_select_mode,
+ VIEW3D_MT_edit_mesh_extrude,
+ VIEW3D_MT_edit_mesh_vertices,
+ VIEW3D_MT_edit_mesh_edges,
+ VIEW3D_MT_edit_mesh_faces,
+ VIEW3D_MT_edit_mesh_normals,
+ VIEW3D_MT_edit_mesh_clean,
+ VIEW3D_MT_edit_mesh_delete,
+ VIEW3D_MT_edit_mesh_showhide,
+ VIEW3D_MT_edit_gpencil,
+ VIEW3D_MT_edit_gpencil_delete,
+ VIEW3D_MT_edit_curve,
+ VIEW3D_MT_edit_curve_ctrlpoints,
+ VIEW3D_MT_edit_curve_segments,
+ VIEW3D_MT_edit_curve_specials,
+ VIEW3D_MT_edit_curve_delete,
+ VIEW3D_MT_edit_curve_showhide,
+ VIEW3D_MT_edit_surface,
+ VIEW3D_MT_edit_font,
+ VIEW3D_MT_edit_text_chars,
+ VIEW3D_MT_edit_meta,
+ VIEW3D_MT_edit_meta_showhide,
+ VIEW3D_MT_edit_lattice,
+ VIEW3D_MT_edit_armature,
+ VIEW3D_MT_armature_specials,
+ VIEW3D_MT_edit_armature_parent,
+ VIEW3D_MT_edit_armature_roll,
+ VIEW3D_MT_edit_armature_delete,
+ VIEW3D_MT_edit_gpencil_transform,
+ VIEW3D_MT_edit_gpencil_interpolate,
+ VIEW3D_PT_viewport_debug,
+ VIEW3D_PT_grease_pencil,
+ VIEW3D_PT_grease_pencil_palettecolor,
+ VIEW3D_PT_view3d_properties,
+ VIEW3D_PT_view3d_cursor,
+ VIEW3D_PT_view3d_name,
+ VIEW3D_PT_view3d_display,
+ VIEW3D_PT_view3d_stereo,
+ VIEW3D_PT_view3d_shading,
+ VIEW3D_PT_view3d_motion_tracking,
+ VIEW3D_PT_view3d_meshdisplay,
+ VIEW3D_PT_view3d_meshstatvis,
+ VIEW3D_PT_view3d_curvedisplay,
+ VIEW3D_PT_background_image,
+ VIEW3D_PT_transform_orientations,
+ VIEW3D_PT_etch_a_ton,
+ VIEW3D_PT_context_properties,
+)
+
+
+if __name__ == "__main__": # only for live edit.
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 60e86d7544d..d58453deaef 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -2008,5 +2008,69 @@ class VIEW3D_PT_tools_history(View3DPanel, Panel):
col.operator("screen.repeat_history", text="History...")
+classes = (
+ VIEW3D_PT_tools_transform,
+ VIEW3D_PT_tools_object,
+ VIEW3D_PT_tools_add_object,
+ VIEW3D_PT_tools_relations,
+ VIEW3D_PT_tools_animation,
+ VIEW3D_PT_tools_rigid_body,
+ VIEW3D_PT_tools_transform_mesh,
+ VIEW3D_PT_tools_meshedit,
+ VIEW3D_PT_tools_meshweight,
+ VIEW3D_PT_tools_add_mesh_edit,
+ VIEW3D_PT_tools_shading,
+ VIEW3D_PT_tools_uvs,
+ VIEW3D_PT_tools_meshedit_options,
+ VIEW3D_PT_tools_transform_curve,
+ VIEW3D_PT_tools_curveedit,
+ VIEW3D_PT_tools_add_curve_edit,
+ VIEW3D_PT_tools_curveedit_options_stroke,
+ VIEW3D_PT_tools_transform_surface,
+ VIEW3D_PT_tools_surfaceedit,
+ VIEW3D_PT_tools_add_surface_edit,
+ VIEW3D_PT_tools_textedit,
+ VIEW3D_PT_tools_armatureedit,
+ VIEW3D_PT_tools_armatureedit_transform,
+ VIEW3D_PT_tools_armatureedit_options,
+ VIEW3D_PT_tools_mballedit,
+ VIEW3D_PT_tools_add_mball_edit,
+ VIEW3D_PT_tools_latticeedit,
+ VIEW3D_PT_tools_posemode,
+ VIEW3D_PT_tools_posemode_options,
+ VIEW3D_PT_imapaint_tools_missing,
+ VIEW3D_PT_tools_brush,
+ TEXTURE_UL_texpaintslots,
+ VIEW3D_MT_tools_projectpaint_uvlayer,
+ VIEW3D_PT_slots_projectpaint,
+ VIEW3D_PT_stencil_projectpaint,
+ VIEW3D_PT_tools_brush_overlay,
+ VIEW3D_PT_tools_brush_texture,
+ VIEW3D_PT_tools_mask_texture,
+ VIEW3D_PT_tools_brush_stroke,
+ VIEW3D_PT_tools_brush_curve,
+ VIEW3D_PT_sculpt_dyntopo,
+ VIEW3D_PT_sculpt_options,
+ VIEW3D_PT_sculpt_symmetry,
+ VIEW3D_PT_tools_brush_appearance,
+ VIEW3D_PT_tools_weightpaint,
+ VIEW3D_PT_tools_weightpaint_options,
+ VIEW3D_PT_tools_vertexpaint,
+ VIEW3D_PT_tools_imagepaint_external,
+ VIEW3D_PT_tools_imagepaint_symmetry,
+ VIEW3D_PT_tools_projectpaint,
+ VIEW3D_MT_tools_projectpaint_stencil,
+ VIEW3D_PT_tools_particlemode,
+ VIEW3D_PT_tools_grease_pencil_draw,
+ VIEW3D_PT_tools_grease_pencil_edit,
+ VIEW3D_PT_tools_grease_pencil_interpolate,
+ VIEW3D_PT_tools_grease_pencil_sculpt,
+ VIEW3D_PT_tools_grease_pencil_brush,
+ VIEW3D_PT_tools_grease_pencil_brushcurves,
+ VIEW3D_PT_tools_history,
+)
+
if __name__ == "__main__": # only for live edit.
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/keyingsets_builtins.py b/release/scripts/startup/keyingsets_builtins.py
index 97320e56378..ce0b1b62d44 100644
--- a/release/scripts/startup/keyingsets_builtins.py
+++ b/release/scripts/startup/keyingsets_builtins.py
@@ -643,13 +643,41 @@ class BUILTIN_KSI_DeltaScale(KeyingSetInfo):
###############################
+classes = (
+ BUILTIN_KSI_Available,
+ BUILTIN_KSI_BendyBones,
+ BUILTIN_KSI_DeltaLocation,
+ BUILTIN_KSI_DeltaRotation,
+ BUILTIN_KSI_DeltaScale,
+ BUILTIN_KSI_LocRot,
+ BUILTIN_KSI_LocRotScale,
+ BUILTIN_KSI_LocScale,
+ BUILTIN_KSI_Location,
+ BUILTIN_KSI_RotScale,
+ BUILTIN_KSI_Rotation,
+ BUILTIN_KSI_Scaling,
+ BUILTIN_KSI_VisualLoc,
+ BUILTIN_KSI_VisualLocRot,
+ BUILTIN_KSI_VisualLocRotScale,
+ BUILTIN_KSI_VisualLocScale,
+ BUILTIN_KSI_VisualRot,
+ BUILTIN_KSI_VisualRotScale,
+ BUILTIN_KSI_VisualScaling,
+ BUILTIN_KSI_WholeCharacter,
+ BUILTIN_KSI_WholeCharacterSelected,
+)
+
def register():
- bpy.utils.register_module(__name__)
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
def unregister():
- bpy.utils.unregister_module(__name__)
+ from bpy.utils import unregister_class
+ for cls in classes:
+ unregister_class(cls)
if __name__ == "__main__":
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 9022faba181..b9cc9540cf7 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -2913,9 +2913,6 @@ DerivedMesh *editbmesh_get_derived_base(Object *obedit, BMEditMesh *em, CustomDa
/* get derived mesh from an object, using editbmesh if available. */
DerivedMesh *object_get_derived_final(Object *ob, const bool for_render)
{
- Mesh *me = ob->data;
- BMEditMesh *em = me->edit_btmesh;
-
if (for_render) {
/* TODO(sergey): use proper derived render here in the future. */
return ob->derivedFinal;
@@ -2923,9 +2920,13 @@ DerivedMesh *object_get_derived_final(Object *ob, const bool for_render)
/* only return the editmesh if its from this object because
* we don't a mesh from another object's modifier stack: T43122 */
- if (em && (em->ob == ob)) {
- DerivedMesh *dm = em->derivedFinal;
- return dm;
+ if (ob->type == OB_MESH) {
+ Mesh *me = ob->data;
+ BMEditMesh *em = me->edit_btmesh;
+ if (em && (em->ob == ob)) {
+ DerivedMesh *dm = em->derivedFinal;
+ return dm;
+ }
}
return ob->derivedFinal;
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index b14ed2d67ad..7094d5a3547 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -588,13 +588,8 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedM
DerivedMesh *ss_mesh = NULL;
ShrinkwrapCalcData calc = NULL_ShrinkwrapCalcData;
- /* remove loop dependencies on derived meshes (TODO should this be done elsewhere?)
- * This also ensure the target is of type OBJ_MESH avoiding crash in `object_get_derived_final` (see T50899). */
- if (smd->target) {
- if (smd->target->type != OB_MESH || smd->target == ob) {
- smd->target = NULL;
- }
- }
+ /* remove loop dependencies on derived meshes (TODO should this be done elsewhere?) */
+ if (smd->target == ob) smd->target = NULL;
if (smd->auxTarget == ob) smd->auxTarget = NULL;
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 64298d25528..24601cc218a 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -2290,7 +2290,7 @@ char *ui_but_string_get_dynamic(uiBut *but, int *r_str_size)
#ifdef WITH_PYTHON
-static bool ui_set_but_string_eval_num_unit(bContext *C, uiBut *but, const char *str, double *value)
+static bool ui_set_but_string_eval_num_unit(bContext *C, uiBut *but, const char *str, double *r_value)
{
char str_unit_convert[256];
const int unit_type = UI_but_unit_type_get(but);
@@ -2302,13 +2302,13 @@ static bool ui_set_but_string_eval_num_unit(bContext *C, uiBut *but, const char
bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr,
ui_get_but_scale_unit(but, 1.0), but->block->unit->system, RNA_SUBTYPE_UNIT_VALUE(unit_type));
- return BPY_execute_string_as_number(C, str_unit_convert, value, true);
+ return BPY_execute_string_as_number(C, str_unit_convert, true, r_value);
}
#endif /* WITH_PYTHON */
-bool ui_but_string_set_eval_num(bContext *C, uiBut *but, const char *str, double *value)
+bool ui_but_string_set_eval_num(bContext *C, uiBut *but, const char *str, double *r_value)
{
bool ok = false;
@@ -2317,13 +2317,13 @@ bool ui_but_string_set_eval_num(bContext *C, uiBut *but, const char *str, double
if (str[0] != '\0') {
bool is_unit_but = (ui_but_is_float(but) && ui_but_is_unit(but));
/* only enable verbose if we won't run again with units */
- if (BPY_execute_string_as_number(C, str, value, is_unit_but == false)) {
+ if (BPY_execute_string_as_number(C, str, is_unit_but == false, r_value)) {
/* if the value parsed ok without unit conversion this button may still need a unit multiplier */
if (is_unit_but) {
char str_new[128];
- BLI_snprintf(str_new, sizeof(str_new), "%f", *value);
- ok = ui_set_but_string_eval_num_unit(C, but, str_new, value);
+ BLI_snprintf(str_new, sizeof(str_new), "%f", *r_value);
+ ok = ui_set_but_string_eval_num_unit(C, but, str_new, r_value);
}
else {
ok = true; /* parse normal string via py (no unit conversion needed) */
@@ -2331,7 +2331,7 @@ bool ui_but_string_set_eval_num(bContext *C, uiBut *but, const char *str, double
}
else if (is_unit_but) {
/* parse failed, this is a unit but so run replacements and parse again */
- ok = ui_set_but_string_eval_num_unit(C, but, str, value);
+ ok = ui_set_but_string_eval_num_unit(C, but, str, r_value);
}
}
diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c
index e07831358d6..3727be1842c 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -497,7 +497,7 @@ bool handleNumInput(bContext *C, NumInput *n, const wmEvent *event)
n->unit_sys, n->unit_type[idx]);
/* Note: with angles, we always get values as radians here... */
- if (BPY_execute_string_as_number(C, str_unit_convert, &val, false)) {
+ if (BPY_execute_string_as_number(C, str_unit_convert, false, &val)) {
n->val[idx] = (float)val;
n->val_flag[idx] &= ~NUM_INVALID;
}
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 47c4b425155..36cf909b299 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -4717,7 +4717,7 @@ static void rna_def_modifier_surfacedeform(BlenderRNA *brna)
PropertyRNA *prop;
srna = RNA_def_struct(brna, "SurfaceDeformModifier", "Modifier");
- RNA_def_struct_ui_text(srna, "SurfaceDeform Modifier", "blablabla");
+ RNA_def_struct_ui_text(srna, "SurfaceDeform Modifier", "");
RNA_def_struct_sdna(srna, "SurfaceDeformModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_MESHDEFORM);
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index 556a00052c6..a0a5760180d 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -958,7 +958,7 @@ static bool surfacedeformBind(SurfaceDeformModifierData *smd, float (*vertexCos)
adj_result = buildAdjacencyMap(mpoly, medge, mloop, tnumpoly, tnumedges, vert_edges, adj_array, edge_polys);
if (adj_result == MOD_SDEF_BIND_RESULT_NONMANY_ERR) {
- modifier_setError((ModifierData *)smd, "Target has edges with more than two polys");
+ modifier_setError((ModifierData *)smd, "Target has edges with more than two polygons");
freeAdjacencyMap(vert_edges, adj_array, edge_polys);
free_bvhtree_from_mesh(&treeData);
MEM_freeN(smd->verts);
@@ -1004,11 +1004,11 @@ static bool surfacedeformBind(SurfaceDeformModifierData *smd, float (*vertexCos)
freeData((ModifierData *)smd);
}
else if (data.success == MOD_SDEF_BIND_RESULT_NONMANY_ERR) {
- modifier_setError((ModifierData *)smd, "Target has edges with more than two polys");
+ modifier_setError((ModifierData *)smd, "Target has edges with more than two polygons");
freeData((ModifierData *)smd);
}
else if (data.success == MOD_SDEF_BIND_RESULT_CONCAVE_ERR) {
- modifier_setError((ModifierData *)smd, "Target contains concave polys");
+ modifier_setError((ModifierData *)smd, "Target contains concave polygons");
freeData((ModifierData *)smd);
}
else if (data.success == MOD_SDEF_BIND_RESULT_OVERLAP_ERR) {
@@ -1020,7 +1020,7 @@ static bool surfacedeformBind(SurfaceDeformModifierData *smd, float (*vertexCos)
* to explain this whith a reasonably sized message.
* Though it shouldn't really matter all that much,
* because this is very unlikely to occur */
- modifier_setError((ModifierData *)smd, "Target contains invalid polys");
+ modifier_setError((ModifierData *)smd, "Target contains invalid polygons");
freeData((ModifierData *)smd);
}
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 3148dab3c50..b4c36a7c516 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -75,7 +75,8 @@ void BPY_thread_restore(BPy_ThreadStatePtr tstate);
bool BPY_execute_filepath(struct bContext *C, const char *filepath, struct ReportList *reports);
bool BPY_execute_text(struct bContext *C, struct Text *text, struct ReportList *reports, const bool do_jump);
-bool BPY_execute_string_as_number(struct bContext *C, const char *expr, double *value, const bool verbose);
+bool BPY_execute_string_as_number(struct bContext *C, const char *expr, const bool verbose, double *r_value);
+bool BPY_execute_string_as_string(struct bContext *C, const char *expr, const bool verbose, char **r_value);
bool BPY_execute_string_ex(struct bContext *C, const char *expr, bool use_eval);
bool BPY_execute_string(struct bContext *C, const char *expr);
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index 7b2d58a1268..2e789d6d4b3 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -918,11 +918,11 @@ char *PyC_FlagSet_AsString(PyC_FlagSet *item)
return cstring;
}
-int PyC_FlagSet_ValueFromID_int(PyC_FlagSet *item, const char *identifier, int *value)
+int PyC_FlagSet_ValueFromID_int(PyC_FlagSet *item, const char *identifier, int *r_value)
{
for ( ; item->identifier; item++) {
if (STREQ(item->identifier, identifier)) {
- *value = item->value;
+ *r_value = item->value;
return 1;
}
}
@@ -930,9 +930,9 @@ int PyC_FlagSet_ValueFromID_int(PyC_FlagSet *item, const char *identifier, int *
return 0;
}
-int PyC_FlagSet_ValueFromID(PyC_FlagSet *item, const char *identifier, int *value, const char *error_prefix)
+int PyC_FlagSet_ValueFromID(PyC_FlagSet *item, const char *identifier, int *r_value, const char *error_prefix)
{
- if (PyC_FlagSet_ValueFromID_int(item, identifier, value) == 0) {
+ if (PyC_FlagSet_ValueFromID_int(item, identifier, r_value) == 0) {
const char *enum_str = PyC_FlagSet_AsString(item);
PyErr_Format(PyExc_ValueError,
"%s: '%.200s' not found in (%s)",
@@ -1006,7 +1006,7 @@ PyObject *PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag)
*
* \note it is caller's responsibility to acquire & release GIL!
*/
-bool PyC_RunString_AsNumber(const char *expr, double *value, const char *filename)
+bool PyC_RunString_AsNumber(const char *expr, const char *filename, double *r_value)
{
PyObject *py_dict, *mod, *retval;
bool ok = true;
@@ -1058,10 +1058,10 @@ bool PyC_RunString_AsNumber(const char *expr, double *value, const char *filenam
ok = false;
}
else if (!isfinite(val)) {
- *value = 0.0;
+ *r_value = 0.0;
}
else {
- *value = val;
+ *r_value = val;
}
}
@@ -1070,4 +1070,41 @@ bool PyC_RunString_AsNumber(const char *expr, double *value, const char *filenam
return ok;
}
+bool PyC_RunString_AsString(const char *expr, const char *filename, char **r_value)
+{
+ PyObject *py_dict, *retval;
+ bool ok = true;
+ PyObject *main_mod = NULL;
+
+ PyC_MainModule_Backup(&main_mod);
+
+ py_dict = PyC_DefaultNameSpace(filename);
+
+ retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
+
+ if (retval == NULL) {
+ ok = false;
+ }
+ else {
+ const char *val;
+ Py_ssize_t val_len;
+
+ val = _PyUnicode_AsStringAndSize(retval, &val_len);
+ if (val == NULL && PyErr_Occurred()) {
+ ok = false;
+ }
+ else {
+ char *val_alloc = MEM_mallocN(val_len + 1, __func__);
+ memcpy(val_alloc, val, val_len + 1);
+ *r_value = val_alloc;
+ }
+
+ Py_DECREF(retval);
+ }
+
+ PyC_MainModule_Restore(main_mod);
+
+ return ok;
+}
+
#endif /* #ifndef MATH_STANDALONE */
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index 04cfc8801eb..3f89e1d82a0 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -75,12 +75,13 @@ typedef struct PyC_FlagSet {
} PyC_FlagSet;
char *PyC_FlagSet_AsString(PyC_FlagSet *item);
-int PyC_FlagSet_ValueFromID_int(PyC_FlagSet *item, const char *identifier, int *value);
-int PyC_FlagSet_ValueFromID(PyC_FlagSet *item, const char *identifier, int *value, const char *error_prefix);
+int PyC_FlagSet_ValueFromID_int(PyC_FlagSet *item, const char *identifier, int *r_value);
+int PyC_FlagSet_ValueFromID(PyC_FlagSet *item, const char *identifier, int *r_value, const char *error_prefix);
int PyC_FlagSet_ToBitfield(PyC_FlagSet *items, PyObject *value, int *r_value, const char *error_prefix);
PyObject *PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag);
-bool PyC_RunString_AsNumber(const char *expr, double *value, const char *filename);
+bool PyC_RunString_AsNumber(const char *expr, const char *filename, double *r_value);
+bool PyC_RunString_AsString(const char *expr, const char *filename, char **r_value);
int PyC_ParseBool(PyObject *o, void *p);
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 311f621e13b..55e477b0214 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -572,21 +572,58 @@ void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr)
/**
* \return success
*/
-bool BPY_execute_string_as_number(bContext *C, const char *expr, double *value, const bool verbose)
+bool BPY_execute_string_as_number(bContext *C, const char *expr, const bool verbose, double *r_value)
{
PyGILState_STATE gilstate;
bool ok = true;
- if (!value || !expr) return -1;
+ if (!r_value || !expr) {
+ return -1;
+ }
+
+ if (expr[0] == '\0') {
+ *r_value = 0.0;
+ return ok;
+ }
+
+ bpy_context_set(C, &gilstate);
+
+ ok = PyC_RunString_AsNumber(expr, "<blender button>", r_value);
+
+ if (ok == false) {
+ if (verbose) {
+ BPy_errors_to_report_ex(CTX_wm_reports(C), false, false);
+ }
+ else {
+ PyErr_Clear();
+ }
+ }
+
+ bpy_context_clear(C, &gilstate);
+
+ return ok;
+}
+
+/**
+ * \return success
+ */
+bool BPY_execute_string_as_string(bContext *C, const char *expr, const bool verbose, char **r_value)
+{
+ PyGILState_STATE gilstate;
+ bool ok = true;
+
+ if (!r_value || !expr) {
+ return -1;
+ }
if (expr[0] == '\0') {
- *value = 0.0;
+ *r_value = NULL;
return ok;
}
bpy_context_set(C, &gilstate);
- ok = PyC_RunString_AsNumber(expr, value, "<blender button>");
+ ok = PyC_RunString_AsString(expr, "<blender button>", r_value);
if (ok == false) {
if (verbose) {
@@ -602,6 +639,7 @@ bool BPY_execute_string_as_number(bContext *C, const char *expr, double *value,
return ok;
}
+
bool BPY_execute_string_ex(bContext *C, const char *expr, bool use_eval)
{
PyGILState_STATE gilstate;
diff --git a/source/blender/python/intern/bpy_utils_units.c b/source/blender/python/intern/bpy_utils_units.c
index 974d7c5549c..e0c70483e3c 100644
--- a/source/blender/python/intern/bpy_utils_units.c
+++ b/source/blender/python/intern/bpy_utils_units.c
@@ -201,7 +201,7 @@ static PyObject *bpyunits_to_value(PyObject *UNUSED(self), PyObject *args, PyObj
bUnit_ReplaceString(str, (int)str_len, uref, scale, usys, ucat);
- if (!PyC_RunString_AsNumber(str, &result, "<bpy_units_api>")) {
+ if (!PyC_RunString_AsNumber(str, "<bpy_units_api>", &result)) {
if (PyErr_Occurred()) {
PyErr_Print();
PyErr_Clear();
diff --git a/tests/python/CMakeLists.txt b/tests/python/CMakeLists.txt
index faa31669f81..5e02b05f995 100644
--- a/tests/python/CMakeLists.txt
+++ b/tests/python/CMakeLists.txt
@@ -83,11 +83,14 @@ add_test(script_pyapi_bpy_utils_units ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_pyapi_bpy_utils_units.py
)
-# test running mathutils testing script
add_test(script_pyapi_mathutils ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_pyapi_mathutils.py
)
+add_test(script_pyapi_idprop ${TEST_BLENDER_EXE}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_pyapi_idprop.py
+)
+
# ------------------------------------------------------------------------------
# MODELING TESTS
add_test(bevel ${TEST_BLENDER_EXE}
diff --git a/tests/python/bl_pyapi_idprop.py b/tests/python/bl_pyapi_idprop.py
new file mode 100644
index 00000000000..0a9cb044571
--- /dev/null
+++ b/tests/python/bl_pyapi_idprop.py
@@ -0,0 +1,144 @@
+# Apache License, Version 2.0
+
+# ./blender.bin --background -noaudio --python tests/python/bl_pyapi_idprop.py -- --verbose
+import bpy
+import unittest
+from array import array
+
+
+class TestHelper:
+
+ @property
+ def id(self):
+ return self._id
+
+ def setUp(self):
+ self._id = bpy.context.scene
+ assert(len(self._id.keys()) == 0)
+
+ def tearDown(self):
+ for key in list(self._id.keys()):
+ del self._id[key]
+
+ def assertAlmostEqualSeq(self, list1, list2):
+ self.assertEqual(len(list1), len(list2))
+ for v1, v2 in zip(list1, list2):
+ self.assertAlmostEqual(v1, v2, places=5)
+
+
+class TestIdPropertyCreation(TestHelper, unittest.TestCase):
+
+ def test_name_empty(self):
+ self.id[""] = 4
+ self.assertEqual(self.id[""], 4)
+
+ def test_name_too_long(self):
+ with self.assertRaises(KeyError):
+ self.id["name" * 30] = 4
+
+ def test_int(self):
+ self.id["a"] = 2
+ self.assertEqual(self.id["a"], 2)
+ self.assertTrue(isinstance(self.id["a"], int))
+
+ with self.assertRaises(OverflowError):
+ self.id["a"] = 2 ** 31 # integer <= 2 ** 31-1
+
+ def test_double(self):
+ self.id["a"] = 2.5
+ self.assertEqual(self.id["a"], 2.5)
+ self.assertTrue(isinstance(self.id["a"], float))
+
+ def test_unicode(self):
+ self.id["a"] = "Hello World"
+ self.assertEqual(self.id["a"], "Hello World")
+ self.assertTrue(isinstance(self.id["a"], str))
+
+ def test_bytes(self):
+ self.id["a"] = b"Hello World"
+ self.assertEqual(self.id["a"], b"Hello World")
+ self.assertTrue(isinstance(self.id["a"], bytes))
+
+ def test_sequence_double_list(self):
+ mylist = [1.2, 3.4, 5.6]
+ self.id["a"] = mylist
+ self.assertEqual(self.id["a"].to_list(), mylist)
+ self.assertEqual(self.id["a"].typecode, "d")
+
+ def test_sequence_int_list(self):
+ mylist = [1, 2, 3]
+ self.id["a"] = mylist
+ self.assertEqual(self.id["a"].to_list(), mylist)
+ self.assertEqual(self.id["a"].typecode, "i")
+
+ def test_sequence_float_array(self):
+ mylist = [1.2, 3.4, 5.6]
+ self.id["a"] = array("f", mylist)
+ self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
+ self.assertEqual(self.id["a"].typecode, "d")
+
+ def test_sequence_double_array(self):
+ mylist = [1.2, 3.4, 5.6]
+ self.id["a"] = array("d", mylist)
+ self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
+ self.assertEqual(self.id["a"].typecode, "d")
+
+ def test_sequence_int_array(self):
+ mylist = [1, 2, 3]
+ self.id["a"] = array("i", mylist)
+ self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
+ self.assertEqual(self.id["a"].typecode, "i")
+
+ def test_sequence_other_array(self):
+ mylist = [1, 2, 3]
+ self.id["a"] = array("Q", mylist)
+ self.assertEqual(self.id["a"].to_list(), mylist)
+
+ def test_sequence_mixed_numerical_type(self):
+ self.id["a"] = [1, 2, 3.4, 5]
+ self.assertAlmostEqualSeq(self.id["a"].to_list(), [1.0, 2.0, 3.4, 5.0])
+ self.assertEqual(self.id["a"].typecode, "d")
+
+ def test_sequence_str_list(self):
+ # I'm a bit surprised that this works
+ mylist = ["abc", "qwe"]
+ self.id["a"] = mylist
+ self.assertEqual(self.id["a"], mylist)
+
+ def test_sequence_mixed_type(self):
+ with self.assertRaises(TypeError):
+ mylist = ["abc", 3, "qwe", 3.4]
+ self.id["a"] = mylist
+
+ def test_mapping_simple(self):
+ mydict = {"1": 10, "2": "20", "3": 30.5}
+ self.id["a"] = mydict
+ self.assertEqual(self.id["a"]["1"], mydict["1"])
+ self.assertEqual(self.id["a"]["2"], mydict["2"])
+ self.assertEqual(self.id["a"]["3"], mydict["3"])
+
+ def test_mapping_complex(self):
+ mydict = {
+ "1": [1, 2, 3],
+ "2": {"1": "abc", "2": array("i", [4, 5, 6])},
+ "3": {"1": {"1": 10}, "2": b"qwe"},
+ }
+ self.id["a"] = mydict
+ self.assertEqual(self.id["a"]["1"].to_list(), [1, 2, 3])
+ self.assertEqual(self.id["a"]["2"]["1"], "abc")
+ self.assertEqual(self.id["a"]["2"]["2"].to_list(), [4, 5, 6])
+ self.assertEqual(self.id["a"]["3"]["1"]["1"], 10)
+ self.assertEqual(self.id["a"]["3"]["2"], b"qwe")
+
+ with self.assertRaises(KeyError):
+ a = self.id["a"]["2"]["a"]
+
+ def test_invalid_type(self):
+ with self.assertRaises(TypeError):
+ self.id["a"] = self
+
+
+if __name__ == '__main__':
+ import sys
+ sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [])
+ unittest.main()