forked from bartvdbraak/blender
fix/disallow [#26502] segmentationfault on pressing button to browse existing images for UV window
creating RNA within draw functions can free existing RNA, crashing blender when this is already used in the UI. disallowing this so it raises a python exception. This was being used to dynamically generate addon categories so for now they are hard coded and we need proper enum-functions for python to do this.
This commit is contained in:
parent
eb53b0fb4c
commit
f2b1645a75
@ -853,8 +853,8 @@ class USERPREF_PT_addons(bpy.types.Panel):
|
||||
bl_region_type = 'WINDOW'
|
||||
bl_options = {'HIDE_HEADER'}
|
||||
|
||||
_addons_cats = None
|
||||
_addons_sups = None
|
||||
# _addons_cats = None
|
||||
# _addons_sups = None
|
||||
_addons_fake_modules = {}
|
||||
|
||||
@classmethod
|
||||
@ -875,6 +875,8 @@ class USERPREF_PT_addons(bpy.types.Panel):
|
||||
# collect the categories that can be filtered on
|
||||
addons = [(mod, addon_utils.module_bl_info(mod)) for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules)]
|
||||
|
||||
# XXX. we need dynamic enums to properly support this.
|
||||
"""
|
||||
cats = {info["category"] for mod, info in addons}
|
||||
cats.discard("")
|
||||
|
||||
@ -882,6 +884,8 @@ class USERPREF_PT_addons(bpy.types.Panel):
|
||||
bpy.types.WindowManager.addon_filter = EnumProperty(items=[(cat, cat, "") for cat in ["All", "Enabled", "Disabled"] + sorted(cats)], name="Category", description="Filter add-ons by category")
|
||||
bpy.types.WindowManager.addon_search = StringProperty(name="Search", description="Search within the selected filter")
|
||||
USERPREF_PT_addons._addons_cats = cats
|
||||
|
||||
[('All', 'All', ''), ('Enabled', 'Enabled', ''), ('Disabled', 'Disabled', ''), ('3D View', '3D View', ''), ('Add Curve', 'Add Curve', ''), ('Add Mesh', 'Add Mesh', ''), ('Animation', 'Animation', ''), ('Development', 'Development', ''), ('Game Engine', 'Game Engine', ''), ('Import-Export', 'Import-Export', ''), ('Mesh', 'Mesh', ''), ('Object', 'Object', ''), ('Render', 'Render', ''), ('Rigging', 'Rigging', ''), ('System', 'System', '')]
|
||||
|
||||
sups_default = {'OFFICIAL', 'COMMUNITY'}
|
||||
sups = sups_default | {info["support"] for mod, info in addons}
|
||||
@ -890,6 +894,7 @@ class USERPREF_PT_addons(bpy.types.Panel):
|
||||
if USERPREF_PT_addons._addons_sups != sups:
|
||||
bpy.types.WindowManager.addon_support = EnumProperty(items=[(sup, sup.title(), "") for sup in reversed(sorted(sups))], name="Support", description="Display support level", default=sups_default, options={'ENUM_FLAG'})
|
||||
USERPREF_PT_addons._addons_sups = sups
|
||||
"""
|
||||
|
||||
split = layout.split(percentage=0.2)
|
||||
col = split.column()
|
||||
@ -1193,6 +1198,37 @@ class WM_OT_addon_expand(bpy.types.Operator):
|
||||
def register():
|
||||
bpy.utils.register_module(__name__)
|
||||
|
||||
WindowManager = bpy.types.WindowManager
|
||||
|
||||
WindowManager.addon_search = StringProperty(name="Search", description="Search within the selected filter")
|
||||
WindowManager.addon_filter = EnumProperty(
|
||||
items=[('All', "All", ""),
|
||||
('Enabled', "Enabled", ""),
|
||||
('Disabled', "Disabled", ""),
|
||||
('3D View', "3D View", ""),
|
||||
('Add Curve', "Add Curve", ""),
|
||||
('Add Mesh', "Add Mesh", ""),
|
||||
('Animation', "Animation", ""),
|
||||
('Development', "Development", ""),
|
||||
('Game Engine', "Game Engine", ""),
|
||||
('Import-Export', "Import-Export", ""),
|
||||
('Mesh', "Mesh", ""),
|
||||
('Object', "Object", ""),
|
||||
('Render', "Render", ""),
|
||||
('Rigging', "Rigging", ""),
|
||||
('System', "System", "")
|
||||
],
|
||||
name="Category",
|
||||
description="Filter add-ons by category",
|
||||
)
|
||||
|
||||
WindowManager.addon_support = EnumProperty(
|
||||
items=[('OFFICIAL', "Official", ""),
|
||||
('COMMUNITY', 'Community', ""),
|
||||
],
|
||||
name="Support",
|
||||
description="Display support level", default={'OFFICIAL', 'COMMUNITY'}, options={'ENUM_FLAG'})
|
||||
|
||||
|
||||
def unregister():
|
||||
bpy.utils.unregister_module(__name__)
|
||||
|
@ -2967,9 +2967,15 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
|
||||
static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value)
|
||||
{
|
||||
StructRNA *srna= srna_from_self(cls, "StructRNA.__setattr__");
|
||||
const int is_deferred_prop= pyrna_is_deferred_prop(value);
|
||||
|
||||
if(srna && !pyrna_write_check() && (is_deferred_prop || RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr)))) {
|
||||
PyErr_Format(PyExc_AttributeError, "pyrna_struct_meta_idprop_setattro() can't set in readonly state '%.200s.%S'", ((PyTypeObject *)cls)->tp_name, attr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(srna == NULL) {
|
||||
if(value && pyrna_is_deferred_prop(value)) {
|
||||
if(value && is_deferred_prop) {
|
||||
PyErr_Format(PyExc_AttributeError, "pyrna_struct_meta_idprop_setattro() unable to get srna from class '%.200s'", ((PyTypeObject *)cls)->tp_name);
|
||||
return -1;
|
||||
}
|
||||
@ -2981,7 +2987,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
|
||||
|
||||
if(value) {
|
||||
/* check if the value is a property */
|
||||
if(pyrna_is_deferred_prop(value)) {
|
||||
if(is_deferred_prop) {
|
||||
int ret= deferred_register_prop(srna, attr, value);
|
||||
if(ret == -1) {
|
||||
/* error set */
|
||||
|
Loading…
Reference in New Issue
Block a user