=Armature Undo Fix=
Armature undo was incomplete; no less then 6 places needed undo pushes. Added undo pushes, and made sure deselectall_armature/posearmature played nice and only did undo pushes when they're called with AKEY. This seems like a fairly old issue. I guess people just didn't notice it enough to file a bug report. :)
This commit is contained in:
@@ -81,8 +81,8 @@ void docentre_armature (struct Object *ob, int centremode);
|
|||||||
void clear_armature(struct Object *ob, char mode);
|
void clear_armature(struct Object *ob, char mode);
|
||||||
|
|
||||||
void delete_armature(void);
|
void delete_armature(void);
|
||||||
void deselectall_armature(int toggle);
|
void deselectall_armature(int toggle, int doundo);
|
||||||
void deselectall_posearmature (struct Object *ob, int test);
|
void deselectall_posearmature (struct Object *ob, int test, int doundo);
|
||||||
int draw_armature(struct Base *base, int dt);
|
int draw_armature(struct Base *base, int dt);
|
||||||
void extrude_armature(int forked);
|
void extrude_armature(int forked);
|
||||||
void subdivide_armature(void);
|
void subdivide_armature(void);
|
||||||
|
|||||||
@@ -1093,7 +1093,7 @@ void mouse_armature(void)
|
|||||||
if (nearBone) {
|
if (nearBone) {
|
||||||
|
|
||||||
if (!(G.qual & LR_SHIFTKEY)) {
|
if (!(G.qual & LR_SHIFTKEY)) {
|
||||||
deselectall_armature(0);
|
deselectall_armature(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* by definition the non-root connected bones have no root point drawn,
|
/* by definition the non-root connected bones have no root point drawn,
|
||||||
@@ -1214,7 +1214,7 @@ void load_editArmature(void)
|
|||||||
toggle==1: swap
|
toggle==1: swap
|
||||||
toggle==2: only active tag
|
toggle==2: only active tag
|
||||||
*/
|
*/
|
||||||
void deselectall_armature(int toggle)
|
void deselectall_armature(int toggle, int doundo)
|
||||||
{
|
{
|
||||||
bArmature *arm= G.obedit->data;
|
bArmature *arm= G.obedit->data;
|
||||||
EditBone *eBone;
|
EditBone *eBone;
|
||||||
@@ -1255,6 +1255,10 @@ void deselectall_armature(int toggle)
|
|||||||
allqueue(REDRAWOOPS, 0);
|
allqueue(REDRAWOOPS, 0);
|
||||||
|
|
||||||
countall(); // flushes selection!
|
countall(); // flushes selection!
|
||||||
|
if (doundo) {
|
||||||
|
if (sel==1) BIF_undo_push("Select All");
|
||||||
|
else BIF_undo_push("Deselect All");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void auto_align_armature(void)
|
void auto_align_armature(void)
|
||||||
@@ -1403,7 +1407,7 @@ static void add_primitive_bone(Object *ob)
|
|||||||
Mat3MulMat3(totmat, obmat, viewmat);
|
Mat3MulMat3(totmat, obmat, viewmat);
|
||||||
Mat3Inv(imat, totmat);
|
Mat3Inv(imat, totmat);
|
||||||
|
|
||||||
deselectall_armature(0);
|
deselectall_armature(0, 0);
|
||||||
|
|
||||||
/* Create a bone */
|
/* Create a bone */
|
||||||
bone= add_editbone("Bone");
|
bone= add_editbone("Bone");
|
||||||
@@ -1472,7 +1476,7 @@ void addvert_armature(void)
|
|||||||
to_root= 1;
|
to_root= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
deselectall_armature(0);
|
deselectall_armature(0, 0);
|
||||||
|
|
||||||
/* we re-use code for mirror editing... */
|
/* we re-use code for mirror editing... */
|
||||||
flipbone= NULL;
|
flipbone= NULL;
|
||||||
@@ -1637,6 +1641,7 @@ void hide_selected_armature_bones(void)
|
|||||||
countall();
|
countall();
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
allqueue(REDRAWBUTSEDIT, 0);
|
allqueue(REDRAWBUTSEDIT, 0);
|
||||||
|
BIF_undo_push("Hide Bones");
|
||||||
}
|
}
|
||||||
|
|
||||||
void hide_unselected_armature_bones(void)
|
void hide_unselected_armature_bones(void)
|
||||||
@@ -1656,6 +1661,7 @@ void hide_unselected_armature_bones(void)
|
|||||||
countall();
|
countall();
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
allqueue(REDRAWBUTSEDIT, 0);
|
allqueue(REDRAWBUTSEDIT, 0);
|
||||||
|
BIF_undo_push("Reveal Bones");
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_all_armature_bones(void)
|
void show_all_armature_bones(void)
|
||||||
@@ -2020,6 +2026,7 @@ void subdivide_armature(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIF_undo_push("Subdivide");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ***************** Pose tools ********************* */
|
/* ***************** Pose tools ********************* */
|
||||||
@@ -2081,7 +2088,7 @@ int do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits)
|
|||||||
if (nearBone) {
|
if (nearBone) {
|
||||||
/* since we do unified select, we don't shift+select a bone if the armature object was not active yet */
|
/* since we do unified select, we don't shift+select a bone if the armature object was not active yet */
|
||||||
if (!(G.qual & LR_SHIFTKEY) || base!=BASACT){
|
if (!(G.qual & LR_SHIFTKEY) || base!=BASACT){
|
||||||
deselectall_posearmature(ob, 0);
|
deselectall_posearmature(ob, 0, 0);
|
||||||
nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL|BONE_ACTIVE);
|
nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL|BONE_ACTIVE);
|
||||||
select_actionchannel_by_name(ob->action, nearBone->name, 1);
|
select_actionchannel_by_name(ob->action, nearBone->name, 1);
|
||||||
}
|
}
|
||||||
@@ -2132,7 +2139,7 @@ int do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits)
|
|||||||
test==1: swap select
|
test==1: swap select
|
||||||
test==2: only clear active tag
|
test==2: only clear active tag
|
||||||
*/
|
*/
|
||||||
void deselectall_posearmature (Object *ob, int test)
|
void deselectall_posearmature (Object *ob, int test, int doundo)
|
||||||
{
|
{
|
||||||
bArmature *arm;
|
bArmature *arm;
|
||||||
bPoseChannel *pchan;
|
bPoseChannel *pchan;
|
||||||
@@ -2176,6 +2183,11 @@ void deselectall_posearmature (Object *ob, int test)
|
|||||||
allqueue(REDRAWACTION, 0);
|
allqueue(REDRAWACTION, 0);
|
||||||
|
|
||||||
countall();
|
countall();
|
||||||
|
|
||||||
|
if (doundo) {
|
||||||
|
if (selectmode==1) BIF_undo_push("Select All");
|
||||||
|
else BIF_undo_push("Deselect All");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2540,6 +2552,7 @@ void hide_unselected_pose_bones(void)
|
|||||||
|
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
allqueue(REDRAWBUTSEDIT, 0);
|
allqueue(REDRAWBUTSEDIT, 0);
|
||||||
|
BIF_undo_push("Hide Bone");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
|
static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
|
||||||
@@ -2571,6 +2584,7 @@ void show_all_pose_bones(void)
|
|||||||
|
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
allqueue(REDRAWBUTSEDIT, 0);
|
allqueue(REDRAWBUTSEDIT, 0);
|
||||||
|
BIF_undo_push("Show Bone");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1246,7 +1246,7 @@ static void do_view3d_select_armaturemenu(void *arg, int event)
|
|||||||
borderselect();
|
borderselect();
|
||||||
break;
|
break;
|
||||||
case 2: /* Select/Deselect all */
|
case 2: /* Select/Deselect all */
|
||||||
deselectall_armature(1);
|
deselectall_armature(1, 1);
|
||||||
break;
|
break;
|
||||||
case 3: /* Select Parent(s) */
|
case 3: /* Select Parent(s) */
|
||||||
select_bone_parent();
|
select_bone_parent();
|
||||||
@@ -1292,7 +1292,7 @@ static void do_view3d_select_pose_armaturemenu(void *arg, int event)
|
|||||||
borderselect();
|
borderselect();
|
||||||
break;
|
break;
|
||||||
case 2: /* Select/Deselect all */
|
case 2: /* Select/Deselect all */
|
||||||
deselectall_posearmature(OBACT, 1);
|
deselectall_posearmature(OBACT, 1, 1);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
pose_select_constraint_target();
|
pose_select_constraint_target();
|
||||||
|
|||||||
@@ -1600,8 +1600,8 @@ static int tree_element_active_posechannel(TreeElement *te, TreeStoreElem *tsele
|
|||||||
if(set) {
|
if(set) {
|
||||||
if(!(pchan->bone->flag & BONE_HIDDEN_P)) {
|
if(!(pchan->bone->flag & BONE_HIDDEN_P)) {
|
||||||
|
|
||||||
if(G.qual & LR_SHIFTKEY) deselectall_posearmature(ob, 2); // 2 = clear active tag
|
if(G.qual & LR_SHIFTKEY) deselectall_posearmature(ob, 2, 0); // 2 = clear active tag
|
||||||
else deselectall_posearmature(ob, 0); // 0 = deselect
|
else deselectall_posearmature(ob, 0, 0); // 0 = deselect
|
||||||
pchan->bone->flag |= BONE_SELECTED|BONE_ACTIVE;
|
pchan->bone->flag |= BONE_SELECTED|BONE_ACTIVE;
|
||||||
|
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
@@ -1624,8 +1624,8 @@ static int tree_element_active_bone(TreeElement *te, TreeStoreElem *tselem, int
|
|||||||
|
|
||||||
if(set) {
|
if(set) {
|
||||||
if(!(bone->flag & BONE_HIDDEN_P)) {
|
if(!(bone->flag & BONE_HIDDEN_P)) {
|
||||||
if(G.qual & LR_SHIFTKEY) deselectall_posearmature(OBACT, 2); // 2 is clear active tag
|
if(G.qual & LR_SHIFTKEY) deselectall_posearmature(OBACT, 2, 0); // 2 is clear active tag
|
||||||
else deselectall_posearmature(OBACT, 0);
|
else deselectall_posearmature(OBACT, 0, 0);
|
||||||
bone->flag |= BONE_SELECTED|BONE_ACTIVE;
|
bone->flag |= BONE_SELECTED|BONE_ACTIVE;
|
||||||
|
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
@@ -1652,8 +1652,8 @@ static int tree_element_active_ebone(TreeElement *te, TreeStoreElem *tselem, int
|
|||||||
if(set) {
|
if(set) {
|
||||||
if(!(ebone->flag & BONE_HIDDEN_A)) {
|
if(!(ebone->flag & BONE_HIDDEN_A)) {
|
||||||
|
|
||||||
if(G.qual & LR_SHIFTKEY) deselectall_armature(2); // only clear active tag
|
if(G.qual & LR_SHIFTKEY) deselectall_armature(2, 0); // only clear active tag
|
||||||
else deselectall_armature(0); // deselect
|
else deselectall_armature(0, 0); // deselect
|
||||||
|
|
||||||
ebone->flag |= BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL|BONE_ACTIVE;
|
ebone->flag |= BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL|BONE_ACTIVE;
|
||||||
// flush to parent?
|
// flush to parent?
|
||||||
|
|||||||
@@ -1556,10 +1556,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
|||||||
else if(G.obedit->type==OB_LATTICE)
|
else if(G.obedit->type==OB_LATTICE)
|
||||||
deselectall_Latt();
|
deselectall_Latt();
|
||||||
else if(G.obedit->type==OB_ARMATURE)
|
else if(G.obedit->type==OB_ARMATURE)
|
||||||
deselectall_armature(1); /* 1 == toggle */
|
deselectall_armature(1, 1); /* 1 == toggle */
|
||||||
}
|
}
|
||||||
else if (ob && (ob->flag & OB_POSEMODE)){
|
else if (ob && (ob->flag & OB_POSEMODE)){
|
||||||
deselectall_posearmature(ob, 1);
|
deselectall_posearmature(ob, 1, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(G.f & G_FACESELECT) deselectall_tface();
|
if(G.f & G_FACESELECT) deselectall_tface();
|
||||||
|
|||||||
Reference in New Issue
Block a user