Fix #28467: Crash while deleting objects in outliner too fast

Cleanup tree when handling object delete from outliner.
Prevents handling the same tree item twice when clicking fast.
This commit is contained in:
2011-09-02 13:23:44 +00:00
parent 3386563368
commit 6b4bdf621f
3 changed files with 16 additions and 0 deletions

View File

@@ -129,6 +129,7 @@ typedef struct TreeElement {
/* outliner_tree.c ----------------------------------------------- */
void outliner_free_tree(ListBase *lb);
void outliner_cleanup_tree(struct SpaceOops *soops);
TreeElement *outliner_find_tse(struct SpaceOops *soops, TreeStoreElem *tse);
TreeElement *outliner_find_id(struct SpaceOops *soops, ListBase *lb, struct ID *id);

View File

@@ -287,6 +287,8 @@ static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
if(base==NULL)
base= object_in_scene((Object *)tselem->id, scene);
if(base) {
SpaceOops *soops= CTX_wm_space_outliner(C);
// check also library later
if(scene->obedit==base->object)
ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
@@ -294,6 +296,13 @@ static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
ED_base_object_free_and_unlink(CTX_data_main(C), scene, base);
te->directdata= NULL;
tselem->id= NULL;
/* XXX: tree management normally happens from draw_outliner(), but when
you're clicking to fast on Delete object from context menu in
outliner several mouse events can be handled in one cycle without
handling notifiers/redraw which leads to deleting the same object twice.
cleanup tree here to prevent such cases. */
outliner_cleanup_tree(soops);
}
}

View File

@@ -222,6 +222,12 @@ void outliner_free_tree(ListBase *lb)
}
}
void outliner_cleanup_tree(SpaceOops *soops)
{
outliner_free_tree(&soops->tree);
outliner_storage_cleanup(soops);
}
/* Find ith item from the treestore */
static TreeElement *outliner_find_tree_element(ListBase *lb, int store_index)
{