Fix outliner and animation editors exiting multi-object edit-mode
When multiple objects were in edit-mode, only the active object would exit edit-mode.
This commit is contained in:
		@@ -207,6 +207,12 @@ bool ED_object_editmode_exit_ex(struct Main *bmain,
 | 
			
		||||
                                int flag);
 | 
			
		||||
bool ED_object_editmode_exit(struct bContext *C, int flag);
 | 
			
		||||
 | 
			
		||||
bool ED_object_editmode_exit_multi_ex(struct Main *bmain,
 | 
			
		||||
                                      struct Scene *scene,
 | 
			
		||||
                                      struct ViewLayer *view_layer,
 | 
			
		||||
                                      int flag);
 | 
			
		||||
bool ED_object_editmode_exit_multi(struct bContext *C, int flag);
 | 
			
		||||
 | 
			
		||||
bool ED_object_editmode_enter_ex(struct Main *bmain,
 | 
			
		||||
                                 struct Scene *scene,
 | 
			
		||||
                                 struct Object *ob,
 | 
			
		||||
 
 | 
			
		||||
@@ -683,6 +683,32 @@ bool ED_object_editmode_exit(bContext *C, int flag)
 | 
			
		||||
  return ED_object_editmode_exit_ex(bmain, scene, obedit, flag);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ED_object_editmode_exit_multi_ex(Main *bmain, Scene *scene, ViewLayer *view_layer, int flag)
 | 
			
		||||
{
 | 
			
		||||
  Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
 | 
			
		||||
  if (obedit == NULL) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  bool changed = false;
 | 
			
		||||
  const short obedit_type = obedit->type;
 | 
			
		||||
 | 
			
		||||
  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
 | 
			
		||||
    Object *ob = base->object;
 | 
			
		||||
    if ((ob->type == obedit_type) && (ob->mode & OB_MODE_EDIT)) {
 | 
			
		||||
      changed |= ED_object_editmode_exit_ex(bmain, scene, base->object, flag);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return changed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ED_object_editmode_exit_multi(bContext *C, int flag)
 | 
			
		||||
{
 | 
			
		||||
  Main *bmain = CTX_data_main(C);
 | 
			
		||||
  Scene *scene = CTX_data_scene(C);
 | 
			
		||||
  ViewLayer *view_layer = CTX_data_view_layer(C);
 | 
			
		||||
  return ED_object_editmode_exit_multi_ex(bmain, scene, view_layer, flag);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ED_object_editmode_enter_ex(Main *bmain, Scene *scene, Object *ob, int flag)
 | 
			
		||||
{
 | 
			
		||||
  bool ok = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -152,7 +152,9 @@ void ED_object_base_activate_with_mode_exit_if_needed(bContext *C, Base *base)
 | 
			
		||||
  if (obedit) {
 | 
			
		||||
    Object *ob = base->object;
 | 
			
		||||
    if (((ob->mode & OB_MODE_EDIT) == 0) || (obedit->type != ob->type)) {
 | 
			
		||||
      ED_object_editmode_exit(C, EM_FREEDATA);
 | 
			
		||||
      Main *bmain = CTX_data_main(C);
 | 
			
		||||
      Scene *scene = CTX_data_scene(C);
 | 
			
		||||
      ED_object_editmode_exit_multi_ex(bmain, scene, view_layer, EM_FREEDATA);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  ED_object_base_activate(C, base);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user