Page Menu
Home
Search
Configure Global Search
Log In
Files
F12214
bone-group-move-sort.patch
Public
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Authored By
Torsten Rupp (rupp)
Nov 13 2013, 2:32 PM
Size
7 KB
Subscribers
None
bone-group-move-sort.patch
View Options
Index: release/scripts/ui/properties_data_armature.py
===================================================================
--- release/scripts/ui/properties_data_armature.py (revision 31886)
+++ release/scripts/ui/properties_data_armature.py (working copy)
@@ -105,6 +105,16 @@
col.prop(arm, "use_deform_delay", text="Delay Refresh")
+class DATA_PT_bone_group_specials(bpy.types.Menu):
+ bl_label = "Bone Group Specials"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("pose.group_sort", icon='SORTALPHA')
+
+
class DATA_PT_bone_groups(ArmatureButtonsPanel, bpy.types.Panel):
bl_label = "Bone Groups"
@@ -117,16 +127,25 @@
ob = context.object
pose = ob.pose
+ group = pose.bone_groups.active
row = layout.row()
- row.template_list(pose, "bone_groups", pose.bone_groups, "active_index", rows=2)
+ rows = 2
+ if group:
+ rows = 5
+ row.template_list(pose, "bone_groups", pose.bone_groups, "active_index", rows=rows)
+
col = row.column(align=True)
col.active = (ob.proxy is None)
col.operator("pose.group_add", icon='ZOOMIN', text="")
col.operator("pose.group_remove", icon='ZOOMOUT', text="")
+ col.menu("DATA_PT_bone_group_specials", icon='DOWNARROW_HLT', text="")
+ if group:
+ col.separator()
+ col.operator("pose.group_move", icon='TRIA_UP', text="").direction = 'UP'
+ col.operator("pose.group_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
- group = pose.bone_groups.active
if group:
col = layout.column()
col.active = (ob.proxy is None)
Index: source/blender/editors/armature/armature_ops.c
===================================================================
--- source/blender/editors/armature/armature_ops.c (revision 31886)
+++ source/blender/editors/armature/armature_ops.c (working copy)
@@ -120,6 +120,8 @@
WM_operatortype_append(POSE_OT_group_add);
WM_operatortype_append(POSE_OT_group_remove);
+ WM_operatortype_append(POSE_OT_group_move);
+ WM_operatortype_append(POSE_OT_group_sort);
WM_operatortype_append(POSE_OT_group_assign);
WM_operatortype_append(POSE_OT_group_unassign);
WM_operatortype_append(POSE_OT_group_select);
Index: source/blender/editors/armature/armature_intern.h
===================================================================
--- source/blender/editors/armature/armature_intern.h (revision 31886)
+++ source/blender/editors/armature/armature_intern.h (working copy)
@@ -104,7 +104,8 @@
void POSE_OT_group_add(struct wmOperatorType *ot);
void POSE_OT_group_remove(struct wmOperatorType *ot);
-void POSE_OT_group_remove(struct wmOperatorType *ot);
+void POSE_OT_group_move(struct wmOperatorType *ot);
+void POSE_OT_group_sort(struct wmOperatorType *ot);
void POSE_OT_group_assign(struct wmOperatorType *ot);
void POSE_OT_group_unassign(struct wmOperatorType *ot);
void POSE_OT_group_select(struct wmOperatorType *ot);
Index: source/blender/editors/armature/poseobject.c
===================================================================
--- source/blender/editors/armature/poseobject.c (revision 31886)
+++ source/blender/editors/armature/poseobject.c (working copy)
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -1147,6 +1148,167 @@
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
+static int group_move_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bActionGroup *grp;
+ int dir= RNA_enum_get(op->ptr, "direction");
+ int grpIndex0,grpIndex1;
+ bPoseChannel *pchan;
+
+ if (ELEM(NULL, ob, pose))
+ return OPERATOR_CANCELLED;
+ if (pose->active_group <= 0)
+ return OPERATOR_CANCELLED;
+
+ /* get group to move */
+ grp= BLI_findlink(&pose->agroups, pose->active_group-1);
+ if (!grp)
+ return OPERATOR_CANCELLED;
+
+ /* move bone group */
+ grpIndex0 = pose->active_group;
+ if (dir == 1) { /* up */
+ void *prev = grp->prev;
+ if (!prev)
+ return OPERATOR_FINISHED;
+ BLI_remlink(&pose->agroups, grp);
+ BLI_insertlinkbefore(&pose->agroups, prev, grp);
+ grpIndex1 = grpIndex0-1;
+ pose->active_group--;
+ } else { /* down */
+ void *next = grp->next;
+ if (!next)
+ return OPERATOR_FINISHED;
+ BLI_remlink(&pose->agroups, grp);
+ BLI_insertlinkafter(&pose->agroups, next, grp);
+ grpIndex1 = grpIndex0+1;
+ pose->active_group++;
+ }
+
+ /* fix changed bone group indizes in bones (swap grpIndex0 with grpIndex1) */
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->bone) {
+ if (pchan->agrp_index == grpIndex1)
+ pchan->agrp_index= grpIndex0;
+ else if (pchan->agrp_index == grpIndex0)
+ pchan->agrp_index= grpIndex1;
+ }
+ }
+
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_group_move(wmOperatorType *ot)
+{
+ static EnumPropertyItem group_slot_move[] = {
+ {1, "UP", 0, "Up", ""},
+ {-1, "DOWN", 0, "Down", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ /* identifiers */
+ ot->name= "Move Bone Group";
+ ot->idname= "POSE_OT_group_move";
+
+ /* api callbacks */
+ ot->exec= group_move_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "direction", group_slot_move, 0, "Direction", "Direction to move, UP or DOWN");
+}
+
+/* bone group sort element */
+typedef struct
+{
+ bActionGroup *agrp;
+ int index;
+} bSortActionGroup;
+
+/* compare bone groups by name */
+static int compare_agroup(const void *sgrp_a_ptr, const void *sgrp_b_ptr)
+{
+ bSortActionGroup *sgrp_a= (bSortActionGroup *)sgrp_a_ptr;
+ bSortActionGroup *sgrp_b= (bSortActionGroup *)sgrp_b_ptr;
+
+ return strcmp(sgrp_a->agrp->name, sgrp_b->agrp->name);
+}
+
+static int group_sort_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ int agrp_count;
+ bSortActionGroup *agrp_array;
+ bActionGroup *agrp;
+ int i;
+ bPoseChannel *pchan;
+
+ if (ELEM(NULL, ob, pose))
+ return OPERATOR_CANCELLED;
+ if (pose->active_group <= 0)
+ return OPERATOR_CANCELLED;
+
+ /* create temporary array with bone groups and indizes */
+ agrp_count = BLI_countlist(&pose->agroups);
+ agrp_array = MEM_mallocN(sizeof(bSortActionGroup) * agrp_count, "sort bone groups");
+ for (agrp= pose->agroups.first, i= 0; agrp; agrp= agrp->next, i++) {
+ assert(i < agrp_count);
+ agrp_array[i].agrp = agrp;
+ agrp_array[i].index = i+1;
+ }
+
+ /* sort bone groups by name */
+ qsort(agrp_array, agrp_count, sizeof(bSortActionGroup), compare_agroup);
+
+ /* create sorted bone group list from sorted array */
+ pose->agroups.first= pose->agroups.last= NULL;
+ for (i= 0; i < agrp_count; i++) {
+ BLI_addtail(&pose->agroups,agrp_array[i].agrp);
+ }
+
+ /* fix changed bone group indizes in bones */
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->bone) {
+ for (i= 0; i < agrp_count; i++) {
+ if (pchan->agrp_index == agrp_array[i].index) {
+ pchan->agrp_index= i+1;
+ break;
+ }
+ }
+ }
+ }
+
+ /* free temp resources */
+ MEM_freeN(agrp_array);
+
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_group_sort(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Sort Bone Groups";
+ ot->idname= "POSE_OT_group_sort";
+
+ /* api callbacks */
+ ot->exec= group_sort_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ------------ */
/* invoke callback which presents a list of bone-groups for the user to choose from */
File Metadata
Details
Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
4e/e3/f64c80bdef3eb2880223cb20e6d7
Event Timeline
Log In to Comment