Fix T41343, hard to remove group from objects.

Added a small menu with a few helper oerators next to each group panel:

* Remove group from all objects
* Select objects in group

More could be added possibly in the future.

Thanks to Campbell for the advice here.
This commit is contained in:
Antonis Ryakiotakis 2014-08-06 20:03:16 +02:00
parent dd5acaaa6c
commit ef68faa2f9
Notes: blender-bot 2023-02-14 11:07:28 +01:00
Referenced by issue #41343, object group can not be deleted after created
4 changed files with 78 additions and 1 deletions

View File

@ -18,7 +18,7 @@
# <pep8 compliant>
import bpy
from bpy.types import Panel
from bpy.types import Panel, Menu
from rna_prop_ui import PropertyPanel
@ -151,6 +151,14 @@ class OBJECT_PT_relations(ObjectButtonsPanel, Panel):
sub.prop_search(ob, "parent_bone", parent.data, "bones", text="")
sub.active = (parent is not None)
class GROUP_MT_specials(Menu):
bl_label = "Group Specials"
def draw(self, context):
layout = self.layout
layout.operator("object.group_unlink", icon='X')
layout.operator("object.grouped_select")
class OBJECT_PT_groups(ObjectButtonsPanel, Panel):
bl_label = "Groups"
@ -183,6 +191,7 @@ class OBJECT_PT_groups(ObjectButtonsPanel, Panel):
row = col.box().row()
row.prop(group, "name", text="")
row.operator("object.group_remove", text="", icon='X', emboss=False)
row.menu("GROUP_MT_specials", icon='DOWNARROW_HLT', text="")
split = col.box().split()

View File

@ -563,3 +563,67 @@ void OBJECT_OT_group_remove(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static int group_unlink_exec(bContext *C, wmOperator *UNUSED(op))
{
Group *group = CTX_data_pointer_get_type(C, "group", &RNA_Group).data;
if (!group)
return OPERATOR_CANCELLED;
BKE_group_unlink(group);
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, NULL);
return OPERATOR_FINISHED;
}
void OBJECT_OT_group_unlink(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Unlink Group";
ot->idname = "OBJECT_OT_group_unlink";
ot->description = "Unlink the group from all objects";
/* api callbacks */
ot->exec = group_unlink_exec;
ot->poll = ED_operator_objectmode;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static int select_grouped_exec(bContext *C, wmOperator *UNUSED(op)) /* Select objects in the same group as the active */
{
Group *group = CTX_data_pointer_get_type(C, "group", &RNA_Group).data;
if (!group)
return OPERATOR_CANCELLED;
CTX_DATA_BEGIN (C, Base *, base, visible_bases)
{
if (!(base->flag & SELECT) && BKE_group_object_exists(group, base->object)) {
ED_base_object_select(base, BA_SELECT);
}
}
CTX_DATA_END;
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, NULL);
return OPERATOR_FINISHED;
}
void OBJECT_OT_grouped_select(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Select Grouped";
ot->idname = "OBJECT_OT_grouped_select";
ot->description = "Select all objects in group";
/* api callbacks */
ot->exec = select_grouped_exec;
ot->poll = ED_operator_objectmode;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}

View File

@ -251,6 +251,8 @@ void OBJECT_OT_shape_key_move(struct wmOperatorType *ot);
void OBJECT_OT_group_add(struct wmOperatorType *ot);
void OBJECT_OT_group_link(struct wmOperatorType *ot);
void OBJECT_OT_group_remove(struct wmOperatorType *ot);
void OBJECT_OT_group_unlink(struct wmOperatorType *ot);
void OBJECT_OT_grouped_select(struct wmOperatorType *ot);
/* object_bake.c */
void OBJECT_OT_bake_image(wmOperatorType *ot);

View File

@ -229,6 +229,8 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_group_add);
WM_operatortype_append(OBJECT_OT_group_link);
WM_operatortype_append(OBJECT_OT_group_remove);
WM_operatortype_append(OBJECT_OT_group_unlink);
WM_operatortype_append(OBJECT_OT_grouped_select);
WM_operatortype_append(OBJECT_OT_hook_add_selob);
WM_operatortype_append(OBJECT_OT_hook_add_newob);