From 443ea628c5c85a137842be27fdb05b1df1ce0c98 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Tue, 12 Mar 2024 23:12:45 +0100 Subject: [PATCH] UI: Changes to Small Operator Confirmations Small operator confirmations get separate confirm and cancel buttons, better descriptions and configurable confirm button text. But still popup at cursor location and can be cancelled with mouse movement. Pull Request: https://projects.blender.org/blender/blender/pulls/118346 --- .../blender/editors/animation/anim_markers.cc | 16 ++++++- .../blender/editors/animation/keyframing.cc | 32 ++++++++++++- .../blender/editors/armature/armature_edit.cc | 18 ++++++- .../editors/armature/armature_relations.cc | 16 ++++++- source/blender/editors/curve/editcurve.cc | 16 ++++++- source/blender/editors/mask/CMakeLists.txt | 1 + source/blender/editors/mask/mask_ops.cc | 20 +++++++- .../blender/editors/metaball/CMakeLists.txt | 1 + source/blender/editors/metaball/mball_edit.cc | 20 +++++++- source/blender/editors/object/object_add.cc | 16 ++++++- .../editors/object/object_bake_simulation.cc | 10 +++- .../editors/object/object_relations.cc | 32 ++++++++++++- .../editors/space_action/action_edit.cc | 17 ++++++- .../editors/space_clip/clip_graph_ops.cc | 20 +++++++- .../editors/space_clip/tracking_ops.cc | 34 +++++++++++++- source/blender/editors/space_file/file_ops.cc | 19 +++++++- .../blender/editors/space_graph/graph_edit.cc | 33 ++++++++++++- source/blender/editors/space_nla/nla_edit.cc | 18 ++++++- source/blender/editors/space_text/text_ops.cc | 26 +++++++++- .../windowmanager/intern/wm_operators.cc | 47 ++++++++++--------- 20 files changed, 368 insertions(+), 44 deletions(-) diff --git a/source/blender/editors/animation/anim_markers.cc b/source/blender/editors/animation/anim_markers.cc index 5c703389aac..5be085743bc 100644 --- a/source/blender/editors/animation/anim_markers.cc +++ b/source/blender/editors/animation/anim_markers.cc @@ -1680,6 +1680,20 @@ static int ed_marker_delete_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int ed_marker_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete selected markers?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return ed_marker_delete_exec(C, op); +} + static void MARKER_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -1688,7 +1702,7 @@ static void MARKER_OT_delete(wmOperatorType *ot) ot->idname = "MARKER_OT_delete"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = ed_marker_delete_invoke; ot->exec = ed_marker_delete_exec; ot->poll = ed_markers_poll_selected_no_locked_markers; diff --git a/source/blender/editors/animation/keyframing.cc b/source/blender/editors/animation/keyframing.cc index 4b08e508307..d6c7b47b762 100644 --- a/source/blender/editors/animation/keyframing.cc +++ b/source/blender/editors/animation/keyframing.cc @@ -713,6 +713,20 @@ static int clear_anim_v3d_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int clear_anim_v3d_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Remove animation from selected objects?"), + nullptr, + IFACE_("Remove"), + ALERT_ICON_NONE, + false); + } + return clear_anim_v3d_exec(C, op); +} + void ANIM_OT_keyframe_clear_v3d(wmOperatorType *ot) { /* identifiers */ @@ -721,7 +735,7 @@ void ANIM_OT_keyframe_clear_v3d(wmOperatorType *ot) ot->idname = "ANIM_OT_keyframe_clear_v3d"; /* callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = clear_anim_v3d_invoke; ot->exec = clear_anim_v3d_exec; ot->poll = ED_operator_areaactive; @@ -855,6 +869,20 @@ static int delete_key_v3d_exec(bContext *C, wmOperator *op) return delete_key_using_keying_set(C, op, ks); } +static int delete_key_v3d_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete keyframes from selected objects?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return delete_key_v3d_exec(C, op); +} + void ANIM_OT_keyframe_delete_v3d(wmOperatorType *ot) { /* identifiers */ @@ -863,7 +891,7 @@ void ANIM_OT_keyframe_delete_v3d(wmOperatorType *ot) ot->idname = "ANIM_OT_keyframe_delete_v3d"; /* callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = delete_key_v3d_invoke; ot->exec = delete_key_v3d_exec; ot->poll = ED_operator_areaactive; diff --git a/source/blender/editors/armature/armature_edit.cc b/source/blender/editors/armature/armature_edit.cc index 800d3f1ab07..1469f09a8fc 100644 --- a/source/blender/editors/armature/armature_edit.cc +++ b/source/blender/editors/armature/armature_edit.cc @@ -36,6 +36,8 @@ #include "RNA_access.hh" #include "RNA_define.hh" +#include "UI_interface_icons.hh" + #include "WM_api.hh" #include "WM_types.hh" @@ -1263,6 +1265,20 @@ static int armature_delete_selected_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int armature_delete_selected_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete selected bones?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return armature_delete_selected_exec(C, op); +} + void ARMATURE_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -1271,7 +1287,7 @@ void ARMATURE_OT_delete(wmOperatorType *ot) ot->description = "Remove selected bones from the armature"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = armature_delete_selected_invoke; ot->exec = armature_delete_selected_exec; ot->poll = ED_operator_editarmature; diff --git a/source/blender/editors/armature/armature_relations.cc b/source/blender/editors/armature/armature_relations.cc index 67569d3b860..409fa009c28 100644 --- a/source/blender/editors/armature/armature_relations.cc +++ b/source/blender/editors/armature/armature_relations.cc @@ -774,6 +774,20 @@ static int separate_armature_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int separate_armature_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Move selected bones to a separate armature?"), + nullptr, + IFACE_("Separate"), + ALERT_ICON_NONE, + false); + } + return separate_armature_exec(C, op); +} + void ARMATURE_OT_separate(wmOperatorType *ot) { /* identifiers */ @@ -782,7 +796,7 @@ void ARMATURE_OT_separate(wmOperatorType *ot) ot->description = "Isolate selected bones into a separate armature"; /* callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = separate_armature_invoke; ot->exec = separate_armature_exec; ot->poll = ED_operator_editarmature; diff --git a/source/blender/editors/curve/editcurve.cc b/source/blender/editors/curve/editcurve.cc index c179a4a38a2..ba0f5d623e0 100644 --- a/source/blender/editors/curve/editcurve.cc +++ b/source/blender/editors/curve/editcurve.cc @@ -1455,6 +1455,20 @@ static int separate_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int separate_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Move selected points to a new object?"), + nullptr, + IFACE_("Separate"), + ALERT_ICON_NONE, + false); + } + return separate_exec(C, op); +} + void CURVE_OT_separate(wmOperatorType *ot) { /* identifiers */ @@ -1463,7 +1477,7 @@ void CURVE_OT_separate(wmOperatorType *ot) ot->description = "Separate selected points from connected unselected points into a new object"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = separate_invoke; ot->exec = separate_exec; ot->poll = ED_operator_editsurfcurve; diff --git a/source/blender/editors/mask/CMakeLists.txt b/source/blender/editors/mask/CMakeLists.txt index 0853b07ddbc..84b53bd8bf6 100644 --- a/source/blender/editors/mask/CMakeLists.txt +++ b/source/blender/editors/mask/CMakeLists.txt @@ -5,6 +5,7 @@ set(INC ../include ../../blenkernel + ../../blentranslation ../../gpu ../../makesrna ../../windowmanager diff --git a/source/blender/editors/mask/mask_ops.cc b/source/blender/editors/mask/mask_ops.cc index 922c53968a1..87a95961991 100644 --- a/source/blender/editors/mask/mask_ops.cc +++ b/source/blender/editors/mask/mask_ops.cc @@ -15,6 +15,8 @@ #include "BKE_context.hh" #include "BKE_mask.h" +#include "BLT_translation.hh" + #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" @@ -32,6 +34,8 @@ #include "ANIM_keyframing.hh" +#include "UI_interface_icons.hh" + #include "RNA_access.hh" #include "RNA_define.hh" @@ -1498,6 +1502,20 @@ static int delete_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete selected control points and splines?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return delete_exec(C, op); +} + void MASK_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -1506,7 +1524,7 @@ void MASK_OT_delete(wmOperatorType *ot) ot->idname = "MASK_OT_delete"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = delete_invoke; ot->exec = delete_exec; ot->poll = ED_maskedit_mask_visible_splines_poll; diff --git a/source/blender/editors/metaball/CMakeLists.txt b/source/blender/editors/metaball/CMakeLists.txt index a709b70328c..a0653d947f9 100644 --- a/source/blender/editors/metaball/CMakeLists.txt +++ b/source/blender/editors/metaball/CMakeLists.txt @@ -5,6 +5,7 @@ set(INC ../include ../../blenkernel + ../../blentranslation ../../gpu ../../makesrna ../../render diff --git a/source/blender/editors/metaball/mball_edit.cc b/source/blender/editors/metaball/mball_edit.cc index 11e7d5e3c3d..b2735484e3c 100644 --- a/source/blender/editors/metaball/mball_edit.cc +++ b/source/blender/editors/metaball/mball_edit.cc @@ -33,6 +33,8 @@ #include "BKE_object.hh" #include "BKE_object_types.hh" +#include "BLT_translation.hh" + #include "DEG_depsgraph.hh" #include "GPU_select.hh" @@ -46,6 +48,8 @@ #include "WM_api.hh" #include "WM_types.hh" +#include "UI_interface_icons.hh" + #include "mball_intern.h" using blender::Span; @@ -609,6 +613,20 @@ static int delete_metaelems_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int delete_metaelems_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete selected metaball elements?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return delete_metaelems_exec(C, op); +} + void MBALL_OT_delete_metaelems(wmOperatorType *ot) { /* identifiers */ @@ -617,7 +635,7 @@ void MBALL_OT_delete_metaelems(wmOperatorType *ot) ot->idname = "MBALL_OT_delete_metaelems"; /* callback functions */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = delete_metaelems_invoke; ot->exec = delete_metaelems_exec; ot->poll = ED_operator_editmball; diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index 6ac996663f9..425529b215e 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -2612,6 +2612,20 @@ static int object_delete_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int object_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete selected objects?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return object_delete_exec(C, op); +} + void OBJECT_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -2620,7 +2634,7 @@ void OBJECT_OT_delete(wmOperatorType *ot) ot->idname = "OBJECT_OT_delete"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = object_delete_invoke; ot->exec = object_delete_exec; ot->poll = ED_operator_objectmode; diff --git a/source/blender/editors/object/object_bake_simulation.cc b/source/blender/editors/object/object_bake_simulation.cc index cae2f168391..a8bba5f1912 100644 --- a/source/blender/editors/object/object_bake_simulation.cc +++ b/source/blender/editors/object/object_bake_simulation.cc @@ -12,6 +12,8 @@ #include "BLI_string.h" #include "BLI_vector.hh" +#include "BLT_translation.hh" + #include "WM_api.hh" #include "WM_types.hh" @@ -663,7 +665,13 @@ static int bake_simulation_invoke(bContext *C, wmOperator *op, const wmEvent * / return OPERATOR_CANCELLED; } if (has_existing_bake_data) { - return WM_operator_confirm_message(C, op, "Overwrite existing bake data"); + return WM_operator_confirm_ex(C, + op, + IFACE_("Overwrite existing bake data?"), + nullptr, + IFACE_("Bake"), + ALERT_ICON_NONE, + false); } Vector requests = bake_simulation_gather_requests(C, op); return start_bake_job(C, std::move(requests), op, BakeRequestsMode::Async); diff --git a/source/blender/editors/object/object_relations.cc b/source/blender/editors/object/object_relations.cc index a15c49603b5..eb7ae8a0e52 100644 --- a/source/blender/editors/object/object_relations.cc +++ b/source/blender/editors/object/object_relations.cc @@ -286,6 +286,20 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) #undef INDEX_UNSET } +static int vertex_parent_set_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Parent selected objects to the selected vertices?"), + nullptr, + IFACE_("Parent"), + ALERT_ICON_NONE, + false); + } + return vertex_parent_set_exec(C, op); +} + void OBJECT_OT_vertex_parent_set(wmOperatorType *ot) { /* identifiers */ @@ -294,7 +308,7 @@ void OBJECT_OT_vertex_parent_set(wmOperatorType *ot) ot->idname = "OBJECT_OT_vertex_parent_set"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = vertex_parent_set_invoke; ot->poll = vertex_parent_set_poll; ot->exec = vertex_parent_set_exec; @@ -1107,6 +1121,20 @@ static int parent_noinv_set_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int parent_noinv_set_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Make Parent without inverse correction?"), + nullptr, + IFACE_("Parent"), + ALERT_ICON_NONE, + false); + } + return parent_noinv_set_exec(C, op); +} + void OBJECT_OT_parent_no_inverse_set(wmOperatorType *ot) { /* identifiers */ @@ -1115,7 +1143,7 @@ void OBJECT_OT_parent_no_inverse_set(wmOperatorType *ot) ot->idname = "OBJECT_OT_parent_no_inverse_set"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = parent_noinv_set_invoke; ot->exec = parent_noinv_set_exec; ot->poll = ED_operator_object_active_editable; diff --git a/source/blender/editors/space_action/action_edit.cc b/source/blender/editors/space_action/action_edit.cc index 24e0dd76bd3..aba89f7d059 100644 --- a/source/blender/editors/space_action/action_edit.cc +++ b/source/blender/editors/space_action/action_edit.cc @@ -37,6 +37,7 @@ #include "BKE_nla.h" #include "BKE_report.hh" +#include "UI_interface_icons.hh" #include "UI_view2d.hh" #include "ANIM_animdata.hh" @@ -1147,6 +1148,20 @@ static int actkeys_delete_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int actkeys_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete selected keyframes?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return actkeys_delete_exec(C, op); +} + void ACTION_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -1155,7 +1170,7 @@ void ACTION_OT_delete(wmOperatorType *ot) ot->description = "Remove all selected keyframes"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = actkeys_delete_invoke; ot->exec = actkeys_delete_exec; ot->poll = ED_operator_action_active; diff --git a/source/blender/editors/space_clip/clip_graph_ops.cc b/source/blender/editors/space_clip/clip_graph_ops.cc index f03b28e23c9..93c02aba6ef 100644 --- a/source/blender/editors/space_clip/clip_graph_ops.cc +++ b/source/blender/editors/space_clip/clip_graph_ops.cc @@ -13,11 +13,15 @@ #include "BLI_rect.h" #include "BLI_utildefines.h" +#include "BLT_translation.hh" + #include "BKE_context.hh" #include "BKE_tracking.h" #include "DEG_depsgraph.hh" +#include "UI_interface_icons.hh" + #include "WM_api.hh" #include "WM_types.hh" @@ -526,6 +530,20 @@ static int delete_curve_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int delete_curve_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete track corresponding to the selected curve?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return delete_curve_exec(C, op); +} + void CLIP_OT_graph_delete_curve(wmOperatorType *ot) { /* identifiers */ @@ -534,7 +552,7 @@ void CLIP_OT_graph_delete_curve(wmOperatorType *ot) ot->idname = "CLIP_OT_graph_delete_curve"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = delete_curve_invoke; ot->exec = delete_curve_exec; ot->poll = clip_graph_knots_poll; diff --git a/source/blender/editors/space_clip/tracking_ops.cc b/source/blender/editors/space_clip/tracking_ops.cc index e3be55e1183..6a5a256bd5a 100644 --- a/source/blender/editors/space_clip/tracking_ops.cc +++ b/source/blender/editors/space_clip/tracking_ops.cc @@ -24,6 +24,8 @@ #include "DEG_depsgraph.hh" +#include "UI_interface_icons.hh" + #include "WM_api.hh" #include "WM_types.hh" @@ -243,6 +245,20 @@ static int delete_track_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int delete_track_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete selected tracks?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return delete_track_exec(C, op); +} + void CLIP_OT_delete_track(wmOperatorType *ot) { /* identifiers */ @@ -251,7 +267,7 @@ void CLIP_OT_delete_track(wmOperatorType *ot) ot->description = "Delete selected tracks"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = delete_track_invoke; ot->exec = delete_track_exec; ot->poll = ED_space_clip_tracking_poll; @@ -309,6 +325,20 @@ static int delete_marker_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int delete_marker_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete marker for current frame from selected tracks?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return delete_marker_exec(C, op); +} + void CLIP_OT_delete_marker(wmOperatorType *ot) { /* identifiers */ @@ -317,7 +347,7 @@ void CLIP_OT_delete_marker(wmOperatorType *ot) ot->description = "Delete marker for current frame from selected tracks"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = delete_marker_invoke; ot->exec = delete_marker_exec; ot->poll = ED_space_clip_tracking_poll; diff --git a/source/blender/editors/space_file/file_ops.cc b/source/blender/editors/space_file/file_ops.cc index 92aff90b03e..4d803e1fbf9 100644 --- a/source/blender/editors/space_file/file_ops.cc +++ b/source/blender/editors/space_file/file_ops.cc @@ -2698,6 +2698,15 @@ static int file_directory_new_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int file_directory_new_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex( + C, op, IFACE_("Create new directory?"), nullptr, IFACE_("Create"), ALERT_ICON_NONE, false); + } + return file_directory_new_exec(C, op); +} + void FILE_OT_directory_new(wmOperatorType *ot) { PropertyRNA *prop; @@ -2708,7 +2717,7 @@ void FILE_OT_directory_new(wmOperatorType *ot) ot->idname = "FILE_OT_directory_new"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = file_directory_new_invoke; ot->exec = file_directory_new_exec; /* File browsing only operator (not asset browsing). */ ot->poll = ED_operator_file_browsing_active; /* <- important, handler is on window level */ @@ -3186,6 +3195,12 @@ static int file_delete_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int file_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + return WM_operator_confirm_ex( + C, op, IFACE_("Delete selected files?"), nullptr, IFACE_("Delete"), ALERT_ICON_NONE, false); +} + void FILE_OT_delete(wmOperatorType *ot) { /* identifiers */ @@ -3194,7 +3209,7 @@ void FILE_OT_delete(wmOperatorType *ot) ot->idname = "FILE_OT_delete"; /* api callbacks */ - ot->invoke = WM_operator_confirm; + ot->invoke = file_delete_invoke; ot->exec = file_delete_exec; ot->poll = file_delete_poll; /* <- important, handler is on window level */ } diff --git a/source/blender/editors/space_graph/graph_edit.cc b/source/blender/editors/space_graph/graph_edit.cc index 8a7e8a06276..a7542ac6e24 100644 --- a/source/blender/editors/space_graph/graph_edit.cc +++ b/source/blender/editors/space_graph/graph_edit.cc @@ -43,6 +43,7 @@ #include "DEG_depsgraph_build.hh" +#include "UI_interface_icons.hh" #include "UI_view2d.hh" #include "ANIM_animdata.hh" @@ -801,6 +802,20 @@ static int graphkeys_delete_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int graphkeys_delete_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete selected keyframes?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); + } + return graphkeys_delete_exec(C, op); +} + void GRAPH_OT_delete(wmOperatorType *ot) { /* Identifiers */ @@ -809,7 +824,7 @@ void GRAPH_OT_delete(wmOperatorType *ot) ot->description = "Remove all selected keyframes"; /* API callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = graphkeys_delete_invoke; ot->exec = graphkeys_delete_exec; ot->poll = graphop_editable_keyframes_poll; @@ -967,6 +982,20 @@ static int graphkeys_keys_to_samples_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int graphkeys_keys_to_samples_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Convert selected keys to samples?"), + nullptr, + IFACE_("Convert"), + ALERT_ICON_NONE, + false); + } + return graphkeys_keys_to_samples_exec(C, op); +} + void GRAPH_OT_keys_to_samples(wmOperatorType *ot) { /* Identifiers */ @@ -976,7 +1005,7 @@ void GRAPH_OT_keys_to_samples(wmOperatorType *ot) "Convert selected channels to an uneditable set of samples to save storage space"; /* API callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = graphkeys_keys_to_samples_invoke; ot->exec = graphkeys_keys_to_samples_exec; ot->poll = graphop_selected_fcurve_poll; diff --git a/source/blender/editors/space_nla/nla_edit.cc b/source/blender/editors/space_nla/nla_edit.cc index 41fa288cfec..fe184f39fc2 100644 --- a/source/blender/editors/space_nla/nla_edit.cc +++ b/source/blender/editors/space_nla/nla_edit.cc @@ -37,6 +37,8 @@ #include "RNA_enum_types.hh" #include "RNA_prototypes.h" +#include "UI_interface_icons.hh" + #include "WM_api.hh" #include "WM_types.hh" @@ -2090,6 +2092,20 @@ static int nlaedit_make_single_user_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int nlaedit_make_single_user_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + if (RNA_boolean_get(op->ptr, "confirm")) { + return WM_operator_confirm_ex(C, + op, + IFACE_("Make each action single-user in the selected strips?"), + nullptr, + IFACE_("Make Single"), + ALERT_ICON_NONE, + false); + } + return nlaedit_make_single_user_exec(C, op); +} + void NLA_OT_make_single_user(wmOperatorType *ot) { /* identifiers */ @@ -2098,7 +2114,7 @@ void NLA_OT_make_single_user(wmOperatorType *ot) ot->description = "Ensure that each action is only used once in the set of strips selected"; /* api callbacks */ - ot->invoke = WM_operator_confirm_or_exec; + ot->invoke = nlaedit_make_single_user_invoke; ot->exec = nlaedit_make_single_user_exec; ot->poll = nlaop_poll_tweakmode_off; diff --git a/source/blender/editors/space_text/text_ops.cc b/source/blender/editors/space_text/text_ops.cc index 273b120fb46..cb879de5b08 100644 --- a/source/blender/editors/space_text/text_ops.cc +++ b/source/blender/editors/space_text/text_ops.cc @@ -540,6 +540,17 @@ static int text_reload_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int text_reload_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + return WM_operator_confirm_ex(C, + op, + IFACE_("Reload active text file?"), + nullptr, + IFACE_("Reload"), + ALERT_ICON_NONE, + false); +} + void TEXT_OT_reload(wmOperatorType *ot) { /* identifiers */ @@ -549,7 +560,7 @@ void TEXT_OT_reload(wmOperatorType *ot) /* api callbacks */ ot->exec = text_reload_exec; - ot->invoke = WM_operator_confirm; + ot->invoke = text_reload_invoke; ot->poll = text_edit_poll; } @@ -591,6 +602,17 @@ static int text_unlink_exec(bContext *C, wmOperator * /*op*/) return OPERATOR_FINISHED; } +static int text_unlink_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/) +{ + return WM_operator_confirm_ex(C, + op, + IFACE_("Delete active text file?"), + nullptr, + IFACE_("Delete"), + ALERT_ICON_NONE, + false); +} + void TEXT_OT_unlink(wmOperatorType *ot) { /* identifiers */ @@ -600,7 +622,7 @@ void TEXT_OT_unlink(wmOperatorType *ot) /* api callbacks */ ot->exec = text_unlink_exec; - ot->invoke = WM_operator_confirm; + ot->invoke = text_unlink_invoke; ot->poll = text_unlink_poll; /* flags */ diff --git a/source/blender/windowmanager/intern/wm_operators.cc b/source/blender/windowmanager/intern/wm_operators.cc index d30861ac79d..906eddb12a9 100644 --- a/source/blender/windowmanager/intern/wm_operators.cc +++ b/source/blender/windowmanager/intern/wm_operators.cc @@ -1160,42 +1160,47 @@ int WM_operator_confirm_message_ex(bContext *C, const char *title, const int icon, const char *message, - const wmOperatorCallContext opcontext) + const wmOperatorCallContext /*opcontext*/) { - IDProperty *properties = static_cast(op->ptr->data); - - if (properties && properties->len) { - properties = IDP_CopyProperty(static_cast(op->ptr->data)); + int alert_icon = ALERT_ICON_QUESTION; + switch (icon) { + case ICON_NONE: + alert_icon = ALERT_ICON_NONE; + break; + case ICON_ERROR: + alert_icon = ALERT_ICON_WARNING; + break; + case ICON_QUESTION: + alert_icon = ALERT_ICON_QUESTION; + break; + case ICON_CANCEL: + alert_icon = ALERT_ICON_ERROR; + break; + case ICON_INFO: + alert_icon = ALERT_ICON_INFO; + break; } - else { - properties = nullptr; - } - - uiPopupMenu *pup = UI_popup_menu_begin(C, title, icon); - uiLayout *layout = UI_popup_menu_layout(pup); - uiItemFullO_ptr( - layout, op->type, message, ICON_NONE, properties, opcontext, UI_ITEM_O_DEPRESS, nullptr); - UI_popup_menu_end(C, pup); - - return OPERATOR_INTERFACE; + return WM_operator_confirm_ex(C, op, IFACE_(title), nullptr, IFACE_(message), alert_icon, false); } int WM_operator_confirm_message(bContext *C, wmOperator *op, const char *message) { - return WM_operator_confirm_message_ex( - C, op, IFACE_("OK?"), ICON_QUESTION, message, WM_OP_EXEC_REGION_WIN); + return WM_operator_confirm_ex( + C, op, IFACE_(message), nullptr, IFACE_("OK"), ALERT_ICON_NONE, false); } int WM_operator_confirm(bContext *C, wmOperator *op, const wmEvent * /*event*/) { - return WM_operator_confirm_message(C, op, nullptr); + return WM_operator_confirm_ex( + C, op, IFACE_(op->type->name), nullptr, IFACE_("OK"), ALERT_ICON_NONE, false); } int WM_operator_confirm_or_exec(bContext *C, wmOperator *op, const wmEvent * /*event*/) { const bool confirm = RNA_boolean_get(op->ptr, "confirm"); if (confirm) { - return WM_operator_confirm_message(C, op, nullptr); + return WM_operator_confirm_ex( + C, op, IFACE_(op->type->name), nullptr, IFACE_("OK"), ALERT_ICON_NONE, false); } return op->type->exec(C, op); } @@ -1535,7 +1540,7 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *region, void *user_ uiTemplateOperatorPropertyButs(C, layout, op, UI_BUT_LABEL_ALIGN_SPLIT_COLUMN, 0); } - uiItemS_ex(layout, small ? 0.4f : 2.0f); + uiItemS_ex(layout, small ? 0.1f : 2.0f); /* Clear so the OK button is left alone. */ UI_block_func_set(block, nullptr, nullptr, nullptr);