def draw_custom_props(self, context, layout): for prop in self.custom_properties: row = layout.row(align=True) row.label(prop.name, icon='DOT') row.prop(prop, '["{}"]'.format(escape_identifier("value")), text="") row = layout.row() row.operator_context = 'INVOKE_SCREEN' row.context_pointer_set("id_data_override", self) row.operator("scene.override_add_custom_property", text="", icon='ZOOMIN')
def draw(layout, context, context_member, property_type, *, use_edit=True): rna_item, context_member = rna_idprop_context_value( context, context_member, property_type) # poll should really get this... if not rna_item: return from bpy.utils import escape_identifier if rna_item.id_data.library is not None: use_edit = False is_lib_override = rna_item.id_data.override_library and rna_item.id_data.override_library.reference assert (isinstance(rna_item, property_type)) items = list(rna_item.items()) items.sort() # TODO: Allow/support adding new custom props to overrides. if use_edit and not is_lib_override: row = layout.row() props = row.operator("wm.properties_add", text="New", icon='ADD') props.data_path = context_member del row layout.separator() show_developer_ui = context.preferences.view.show_developer_ui rna_properties = { prop.identifier for prop in rna_item.bl_rna.properties if prop.is_runtime } if items else None layout.use_property_decorate = False for key, value in items: is_rna = (key in rna_properties) # Only show API defined properties to developers. if is_rna and not show_developer_ui: continue to_dict = getattr(value, "to_dict", None) to_list = getattr(value, "to_list", None) if to_dict: value = to_dict() elif to_list: value = to_list() split = layout.split(factor=0.4, align=True) label_row = split.row() label_row.alignment = 'RIGHT' label_row.label(text=key, translate=False) value_row = split.row(align=True) value_column = value_row.column(align=True) is_long_array = to_list and len(value) >= MAX_DISPLAY_ROWS if is_rna: value_column.prop(rna_item, key, text="") elif to_dict or is_long_array: props = value_column.operator("wm.properties_edit_value", text="Edit Value") props.data_path = context_member props.property_name = key else: value_column.prop(rna_item, '["%s"]' % escape_identifier(key), text="") operator_row = value_row.row() # Do not allow editing of overridden properties (we cannot use a poll function # of the operators here since they's have no access to the specific property). operator_row.enabled = not ( is_lib_override and key in rna_item.id_data.override_library.reference) if use_edit: if is_rna: operator_row.label(text="API Defined") elif is_lib_override: operator_row.active = False operator_row.label(text="", icon='DECORATE_LIBRARY_OVERRIDE') else: props = operator_row.operator("wm.properties_edit", text="", icon='PREFERENCES', emboss=False) props.data_path = context_member props.property_name = key props = operator_row.operator("wm.properties_remove", text="", icon='X', emboss=False) props.data_path = context_member props.property_name = key else: # Add some spacing, so the right side of the buttons line up with layouts with decorators. operator_row.label(text="", icon='BLANK1')
def draw(layout, context, context_member, property_type, use_edit=True): def assign_props(prop, val, key): prop.data_path = context_member prop.property = key try: prop.value = str(val) except: pass rna_item, context_member = rna_idprop_context_value(context, context_member, property_type) # poll should really get this... if not rna_item: return from bpy.utils import escape_identifier if rna_item.id_data.library is not None: use_edit = False assert(isinstance(rna_item, property_type)) items = rna_item.items() items.sort() if use_edit: row = layout.row() props = row.operator("wm.properties_add", text="Add") props.data_path = context_member del row rna_properties = {prop.identifier for prop in rna_item.bl_rna.properties if prop.is_runtime} if items else None for key, val in items: if key == '_RNA_UI': continue row = layout.row() to_dict = getattr(val, "to_dict", None) to_list = getattr(val, "to_list", None) # val_orig = val # UNUSED if to_dict: val = to_dict() val_draw = str(val) elif to_list: val = to_list() val_draw = str(val) else: val_draw = val box = row.box() if use_edit: split = box.split(percentage=0.75) row = split.row() else: row = box.row() row.label(text=key, translate=False) # explicit exception for arrays is_rna = (key in rna_properties) if to_dict or to_list: row.label(text=val_draw, translate=False) else: if is_rna: row.prop(rna_item, key, text="") else: row.prop(rna_item, '["%s"]' % escape_identifier(key), text="") if use_edit: row = split.row(align=True) if not is_rna: props = row.operator("wm.properties_edit", text="Edit") assign_props(props, val_draw, key) else: row.label(text="API Defined") props = row.operator("wm.properties_remove", text="", icon='ZOOMOUT') assign_props(props, val_draw, key)
def draw(layout, context, context_member, property_type, use_edit=True): def assign_props(prop, val, key): prop.data_path = context_member prop.property = key try: prop.value = str(val) except: pass rna_item, context_member = rna_idprop_context_value( context, context_member, property_type) # poll should really get this... if not rna_item: return from bpy.utils import escape_identifier if rna_item.id_data.library is not None: use_edit = False is_lib_override = rna_item.id_data.override_library and rna_item.id_data.override_library.reference assert (isinstance(rna_item, property_type)) items = list(rna_item.items()) items.sort() # TODO: Allow/support adding new custom props to overrides. if use_edit and not is_lib_override: row = layout.row() props = row.operator("wm.properties_add", text="Add") props.data_path = context_member del row show_developer_ui = context.preferences.view.show_developer_ui rna_properties = { prop.identifier for prop in rna_item.bl_rna.properties if prop.is_runtime } if items else None layout.use_property_split = True layout.use_property_decorate = False # No animation. flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True) for key, val in items: if key == '_RNA_UI': continue is_rna = (key in rna_properties) # only show API defined for developers if is_rna and not show_developer_ui: continue to_dict = getattr(val, "to_dict", None) to_list = getattr(val, "to_list", None) # val_orig = val # UNUSED if to_dict: val = to_dict() val_draw = str(val) elif to_list: val = to_list() val_draw = str(val) else: val_draw = val row = layout.row(align=True) box = row.box() if use_edit: split = box.split(factor=0.75) row = split.row() else: split = box.split(factor=1.00) row = split.row() row.alignment = 'RIGHT' row.label(text=key, translate=False) # explicit exception for arrays. show_array_ui = to_list and not is_rna and 0 < len( val) <= MAX_DISPLAY_ROWS if show_array_ui and isinstance(val[0], (int, float)): row.prop(rna_item, '["%s"]' % escape_identifier(key), text="") elif to_dict or to_list: row.label(text=val_draw, translate=False) else: if is_rna: row.prop(rna_item, key, text="") else: row.prop(rna_item, '["%s"]' % escape_identifier(key), text="") if use_edit: row = split.row(align=True) # Do not allow editing of overridden properties (we cannot use a poll function of the operators here # since they's have no access to the specific property...). row.enabled = not (is_lib_override and key in rna_item.id_data.override_library.reference) if is_rna: row.label(text="API Defined") elif is_lib_override: row.label(text="Library Override") else: props = row.operator("wm.properties_edit", text="Edit") assign_props(props, val_draw, key) props = row.operator("wm.properties_remove", text="", icon='REMOVE') assign_props(props, val_draw, key) del flow
def draw(layout, context, context_member, property_type, use_edit=True): def assign_props(prop, val, key): prop.data_path = context_member prop.property = key try: prop.value = str(val) except: pass rna_item, context_member = rna_idprop_context_value(context, context_member, property_type) # poll should really get this... if not rna_item: return from bpy.utils import escape_identifier if rna_item.id_data.library is not None: use_edit = False assert(isinstance(rna_item, property_type)) items = rna_item.items() items.sort() if use_edit: row = layout.row() props = row.operator("wm.properties_add", text="Add") props.data_path = context_member del row show_developer_ui = context.preferences.view.show_developer_ui rna_properties = {prop.identifier for prop in rna_item.bl_rna.properties if prop.is_runtime} if items else None layout.use_property_split = True layout.use_property_decorate = False # No animation. flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True) for key, val in items: if key == '_RNA_UI': continue is_rna = (key in rna_properties) # only show API defined for developers if is_rna and not show_developer_ui: continue to_dict = getattr(val, "to_dict", None) to_list = getattr(val, "to_list", None) # val_orig = val # UNUSED if to_dict: val = to_dict() val_draw = str(val) elif to_list: val = to_list() val_draw = str(val) else: val_draw = val row = flow.row(align=True) box = row.box() if use_edit: split = box.split(factor=0.75) row = split.row(align=True) else: row = box.row(align=True) row.alignment = 'RIGHT' row.label(text=key, translate=False) # explicit exception for arrays. if to_dict or to_list: row.label(text=val_draw, translate=False) else: if is_rna: row.prop(rna_item, key, text="") else: row.prop(rna_item, '["%s"]' % escape_identifier(key), text="") if use_edit: row = split.row(align=True) if not is_rna: props = row.operator("wm.properties_edit", text="Edit") assign_props(props, val_draw, key) props = row.operator("wm.properties_remove", text="", icon='REMOVE') assign_props(props, val_draw, key) else: row.label(text="API Defined") del flow