Exemplo n.º 1
0
 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')
Exemplo n.º 2
0
    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')
Exemplo n.º 3
0
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')
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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