Fix for the "black F-Curves" bug on undo
authorJoshua Leung <aligorith@gmail.com>
Tue, 3 Jul 2012 13:47:13 +0000 (13:47 +0000)
committerJoshua Leung <aligorith@gmail.com>
Tue, 3 Jul 2012 13:47:13 +0000 (13:47 +0000)
(From personal stash of bugs - since early 2.5 versions)

F-Curve colors get applied only on Graph Editor "refresh()". In some cases, undo
was reverting back to a state where the colors had not yet been set. In these
cases, there would be no refresh() after that undo (until expanding a channel or
some other similar action), resulting in "black F-Curves" appearing. So, now we
force such an update after undo to ensure that the curves never display black.

(Noticed while investigating another bug for Mango related to
CLIP_OT_constraint_to_fcurve not sending notifiers required when new F-Curves
are added)

source/blender/blenloader/intern/readfile.c
source/blender/editors/space_graph/space_graph.c

index 836f723327eba2839b59584f5141b51c09be250e..7133f79f880b04125193b6483db53e964f0723d4 100644 (file)
@@ -5533,6 +5533,11 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
                                                if (ads->filter_grp)
                                                        ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0);
                                        }
+                                       
+                                       /* force recalc of list of channels (i.e. includes calculating F-Curve colors)
+                                        * thus preventing the "black curves" problem post-undo
+                                        */
+                                       sipo->flag |= SIPO_TEMP_NEEDCHANSYNC;
                                }
                                else if (sl->spacetype == SPACE_BUTS) {
                                        SpaceButs *sbuts = (SpaceButs *)sl;
@@ -5547,10 +5552,10 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
                                        SpaceAction *saction = (SpaceAction *)sl;
                                        
                                        saction->action = restore_pointer_by_name(newmain, (ID *)saction->action, 1);
-                                       saction->ads.source= restore_pointer_by_name(newmain, (ID *)saction->ads.source, 1);
+                                       saction->ads.source = restore_pointer_by_name(newmain, (ID *)saction->ads.source, 1);
                                        
                                        if (saction->ads.filter_grp)
-                                               saction->ads.filter_grp= restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, 0);
+                                               saction->ads.filter_grp = restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, 0);
                                                
                                        
                                        /* force recalc of list of channels, potentially updating the active action 
index 756e6997fc817e48ad23b5ebcd7a75adf56e83f1..f4cb4ec3d055e7ccb637616ddfcc4d32d5268815 100644 (file)
@@ -189,6 +189,8 @@ static void graph_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
                sipo->ads->source = (ID *)(G.main->scene.first); // FIXME: this is a really nasty hack here for now...
        }
        
+       /* force immediate init of any invalid F-Curve colors */
+       sipo->flag |= SIPO_TEMP_NEEDCHANSYNC;
        ED_area_tag_refresh(sa);
 }
 
@@ -477,7 +479,13 @@ static void graph_listener(ScrArea *sa, wmNotifier *wmn)
                        if (wmn->data == ND_SPACE_GRAPH)
                                ED_area_tag_redraw(sa);
                        break;
-               
+               case NC_WINDOW:
+                       if (sipo->flag & SIPO_TEMP_NEEDCHANSYNC) {
+                               /* force redraw/refresh after undo/redo - prevents "black curve" problem */
+                               ED_area_tag_refresh(sa);
+                       }
+                       break;
+                       
                        // XXX: restore the case below if not enough updates occur...
                        //default:
                        //      if (wmn->data==ND_KEYS)