Outliner: use undo-group for outliner mode switching
Switching modes no longer adds multiple undo steps from a user perspective.
This commit is contained in:
parent
3cc6b423b1
commit
9ab4536218
Notes:
blender-bot
2023-02-14 06:21:59 +01:00
Referenced by issue #82233, Outliner: 2020 GSoC Follow-up Tasks
|
@ -2013,6 +2013,8 @@ static void outliner_draw_mode_column_toggle(uiBlock *block,
|
|||
tip);
|
||||
UI_but_func_set(but, outliner_mode_toggle_fn, tselem, NULL);
|
||||
UI_but_flag_enable(but, UI_BUT_DRAG_LOCK);
|
||||
/* Mode toggling handles it's own undo state because undo steps need to be grouped. */
|
||||
UI_but_flag_disable(but, UI_BUT_UNDO);
|
||||
|
||||
if (ID_IS_LINKED(&ob->id)) {
|
||||
UI_but_disable(but, TIP_("Can't edit external library data"));
|
||||
|
|
|
@ -77,6 +77,8 @@
|
|||
|
||||
/**
|
||||
* \note changes to selection are by convention and not essential.
|
||||
*
|
||||
* \note Handles own undo push.
|
||||
*/
|
||||
static void do_outliner_item_editmode_toggle(bContext *C, Scene *scene, Base *base)
|
||||
{
|
||||
|
@ -102,11 +104,14 @@ static void do_outliner_item_editmode_toggle(bContext *C, Scene *scene, Base *ba
|
|||
if (changed) {
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
|
||||
ED_outliner_select_sync_from_object_tag(C);
|
||||
ED_undo_push(C, "Outliner Edit Mode Toggle");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \note changes to selection are by convention and not essential.
|
||||
*
|
||||
* \note Handles own undo push.
|
||||
*/
|
||||
static void do_outliner_item_posemode_toggle(bContext *C, Scene *scene, Base *base)
|
||||
{
|
||||
|
@ -137,6 +142,7 @@ static void do_outliner_item_posemode_toggle(bContext *C, Scene *scene, Base *ba
|
|||
if (changed) {
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
|
||||
ED_outliner_select_sync_from_object_tag(C);
|
||||
ED_undo_push(C, "Outliner Pose Mode Toggle");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -148,10 +154,13 @@ static void do_outliner_item_posemode_toggle(bContext *C, Scene *scene, Base *ba
|
|||
*
|
||||
* If we didn't want to touch selection we could add an option to the operators
|
||||
* not to do multi-object editing.
|
||||
*
|
||||
* \note Handles own undo push.
|
||||
*/
|
||||
static void do_outliner_item_mode_toggle_generic(bContext *C, TreeViewContext *tvc, Base *base)
|
||||
{
|
||||
const int active_mode = tvc->obact->mode;
|
||||
ED_undo_group_begin(C);
|
||||
|
||||
if (ED_object_mode_set(C, OB_MODE_OBJECT)) {
|
||||
Base *base_active = BKE_view_layer_base_find(tvc->view_layer, tvc->obact);
|
||||
|
@ -159,13 +168,14 @@ static void do_outliner_item_mode_toggle_generic(bContext *C, TreeViewContext *t
|
|||
BKE_view_layer_base_deselect_all(tvc->view_layer);
|
||||
BKE_view_layer_base_select_and_set_active(tvc->view_layer, base);
|
||||
DEG_id_tag_update(&tvc->scene->id, ID_RECALC_SELECT);
|
||||
ED_undo_push(C, "Change Active");
|
||||
|
||||
/* XXX: Must add undo step between activation and setting mode to prevent an assert. */
|
||||
ED_undo_push(C, "outliner mode toggle");
|
||||
/* Operator call does undo push. */
|
||||
ED_object_mode_set(C, active_mode);
|
||||
ED_outliner_select_sync_from_object_tag(C);
|
||||
}
|
||||
}
|
||||
ED_undo_group_end(C);
|
||||
}
|
||||
|
||||
/* Toggle the item's interaction mode if supported */
|
||||
|
|
Loading…
Reference in New Issue