Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2009-04-15 16:38:04 +0400
committerJoshua Leung <aligorith@gmail.com>2009-04-15 16:38:04 +0400
commit1680f5f2b01d0c48a1d8fcbcda3e90aa015bf6e7 (patch)
tree726d9bcc6f6c3126f39e3af3bd44d17ff316d490
parent4c66f26230feaa7cb326f1f093c67d33c1e4c4aa (diff)
PoseLib: Fixed lingering bugs with Browsing (Ctrl-L)
* Bug with confirming was due to mixed up order for events handling and updates for drawing. Now events are handled before relevant updates are done for drawing, since these only get called when an event occurs. * View manipulations work again, and in a much nicer way thanks to the OPERATOR_PASS_THROUGH flags :) * Search seems to work much better now again too...
-rw-r--r--source/blender/editors/armature/poselib.c82
1 files changed, 37 insertions, 45 deletions
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 6b79ef375c4..50588a2a258 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -725,8 +725,7 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
frame= pld->marker->frame;
else
return;
-
- printf("apply pose ---> %d \n", frame);
+
/* init settings for testing groups for keyframes */
group_ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
@@ -739,8 +738,6 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
for (agrp= act->groups.first; agrp; agrp= agrp->next) {
/* check if group has any keyframes */
if (ANIM_animchanneldata_keys_bezier_loop(&bed, agrp, ALE_GROUP, NULL, group_ok_cb, NULL, 0)) {
- printf("\tact group %s ok \n", agrp->name);
-
/* has keyframe on this frame, so try to get a PoseChannel with this name */
pchan= get_pose_channel(pose, agrp->name);
@@ -760,14 +757,10 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
ok = 1;
}
- if (ok) {
- printf("\t\tevaluating... \n");
+ if (ok)
animsys_evaluate_action_group(ptr, act, agrp, NULL, (float)frame);
- }
}
}
- else
- printf("\tact group %s not ok \n", agrp->name);
}
}
@@ -830,12 +823,8 @@ static void poselib_preview_apply (bContext *C, wmOperator *op)
{
tPoseLib_PreviewData *pld= (tPoseLib_PreviewData *)op->customdata;
- printf("do apply(C, op) \n");
-
/* only recalc pose (and its dependencies) if pose has changed */
if (pld->redraw == PL_PREVIEW_REDRAWALL) {
- printf("\tupdate pose \n");
-
/* don't clear pose if firsttime */
if ((pld->flag & PL_PREVIEW_FIRSTTIME)==0)
poselib_backup_restore(pld);
@@ -1056,9 +1045,10 @@ static void poselib_preview_handle_search (tPoseLib_PreviewData *pld, unsigned s
}
/* handle events for poselib_preview_poses */
-static void poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *event)
+static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *event)
{
tPoseLib_PreviewData *pld= op->customdata;
+ int ret = OPERATOR_RUNNING_MODAL;
/* backup stuff that needs to occur before every operation
* - make a copy of searchstr, so that we know if cache needs to be rebuilt
@@ -1082,23 +1072,18 @@ static void poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *
pld->state= PL_PREVIEW_CONFIRM;
break;
-#if 0 // XXX these are for view manipulation... how to get it working?
/* view manipulation */
- case MIDDLEMOUSE:
- // there's a little bug here that causes the normal header to get drawn while view is manipulated
- // XXX handle_view_middlemouse();
- pld->redraw= PL_PREVIEW_REDRAWHEADER;
- break;
-
- /* view manipulation, or searching */
+ /* we add pass through here, so that the operators responsible for these can still run,
+ * even though we still maintain control (as RUNNING_MODAL flag is still set too)
+ */
case PAD0: case PAD1: case PAD2: case PAD3: case PAD4:
case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
- case PADPLUSKEY: case PADMINUS:
- //persptoetsen(event);
- pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ case PADPLUSKEY: case PADMINUS: case MIDDLEMOUSE:
+ //pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ ret |= OPERATOR_PASS_THROUGH;
break;
-#endif // XXX these are for view manipulation... how to get it working?
+ /* quicky compare to original */
case TABKEY:
pld->flag &= ~PL_PREVIEW_SHOWORIGINAL;
pld->redraw= PL_PREVIEW_REDRAWALL;
@@ -1106,7 +1091,7 @@ static void poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *
}
/* EXITS HERE... */
- return;
+ return ret;
}
/* NORMAL EVENT HANDLING... */
@@ -1124,7 +1109,6 @@ static void poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *
case PADENTER:
case SPACEKEY:
pld->state= PL_PREVIEW_CONFIRM;
- printf("poselib event -> set confirm \n");
break;
/* toggle between original pose and poselib pose*/
@@ -1218,13 +1202,14 @@ static void poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *
pld->redraw= PL_PREVIEW_REDRAWALL;
}
break;
-
-#if 0 // XXX these are for view manipulation... how to get it working?
+
/* view manipulation */
+ /* we add pass through here, so that the operators responsible for these can still run,
+ * even though we still maintain control (as RUNNING_MODAL flag is still set too)
+ */
case MIDDLEMOUSE:
- // there's a little bug here that causes the normal header to get drawn while view is manipulated
- // XXX handle_view_middlemouse();
- pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ //pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ ret |= OPERATOR_PASS_THROUGH;
break;
/* view manipulation, or searching */
@@ -1232,20 +1217,23 @@ static void poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *
case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
case PADPLUSKEY: case PADMINUS:
if (pld->searchstr[0]) {
- poselib_preview_handle_search(pld, event, ascii);
+ /* searching... */
+ poselib_preview_handle_search(pld, event->type, event->ascii);
}
else {
- persptoetsen(event);
- pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ /* view manipulation (see above) */
+ //pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ ret |= OPERATOR_PASS_THROUGH;
}
break;
-#endif // XXX these are for view manipulation... how to get it working?
/* otherwise, assume that searching might be able to handle it */
default:
poselib_preview_handle_search(pld, event->type, event->ascii);
break;
}
+
+ return ret;
}
/* ---------------------------- */
@@ -1403,16 +1391,13 @@ static int poselib_preview_cancel (bContext *C, wmOperator *op)
/* main modal status check */
static int poselib_preview_modal (bContext *C, wmOperator *op, wmEvent *event)
{
- tPoseLib_PreviewData *pld= op->customdata;
+ tPoseLib_PreviewData *pld= op->customdata;
+ int ret;
/* 1) check state to see if we're still running */
if (ELEM(pld->state, PL_PREVIEW_RUNONCE, PL_PREVIEW_RUNNING) == 0)
return poselib_preview_exit(C, op);
- /* 2) apply changes and redraw */
- if (pld->redraw)
- poselib_preview_apply(C, op);
-
/* check if time to exit */
if (pld->state == PL_PREVIEW_RUNONCE) {
/* set status to cleanup time */
@@ -1421,10 +1406,14 @@ static int poselib_preview_modal (bContext *C, wmOperator *op, wmEvent *event)
return poselib_preview_exit(C, op);
}
- /* 3) handle events */
- poselib_preview_handle_event(C, op, event);
+ /* 2) handle events */
+ ret= poselib_preview_handle_event(C, op, event);
- return OPERATOR_RUNNING_MODAL;
+ /* 3) apply changes and redraw, otherwise, confirming goes wrong */
+ if (pld->redraw)
+ poselib_preview_apply(C, op);
+
+ return ret; //OPERATOR_RUNNING_MODAL;
}
/* Modal Operator init */
@@ -1442,6 +1431,9 @@ static int poselib_preview_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
+ /* do initial apply to have something to look at */
+ poselib_preview_apply(C, op);
+
/* add temp handler if we're running as a modal operator */
WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);