Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2022-02-04 02:36:05 +0300
committerPhilipp Oeser <info@graphics-engineer.com>2022-03-21 15:19:33 +0300
commit188277f9512f128b48335e45a7651482a2a226b7 (patch)
treee3ad0338ab9b60fffd56f1d6801478c6b441c0af
parent45482ac5764f133f401dd84cc1df1c9e331ca239 (diff)
Fix T94334: Area close operator crash in 3D view menu
This fixes the crash by removing the `do_view3d_header_buttons` handler. The code can work at a higher level here, using the operator for setting the select mode, which makes this patch a cleanup as well. The operator now has a description callback to add the custom description used for the behavior in its invoke method. Differential Revision: https://developer.blender.org/D13660
-rw-r--r--source/blender/editors/mesh/editmesh_select.c34
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c128
2 files changed, 69 insertions, 93 deletions
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 7e05209f79e..6b2d56322fc 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -32,6 +32,7 @@
#include "BLI_math.h"
#include "BLI_math_bits.h"
#include "BLI_rand.h"
+#include "BLI_string.h"
#include "BLI_utildefines_stack.h"
#include "BKE_context.h"
@@ -55,6 +56,8 @@
#include "ED_transform.h"
#include "ED_view3d.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
@@ -1389,6 +1392,36 @@ static int edbm_select_mode_invoke(bContext *C, wmOperator *op, const wmEvent *e
return edbm_select_mode_exec(C, op);
}
+static char *edbm_select_mode_get_description(struct bContext *UNUSED(C),
+ struct wmOperatorType *UNUSED(op),
+ struct PointerRNA *values)
+{
+ const int type = RNA_enum_get(values, "type");
+
+ /* Because the special behavior for shift and ctrl click depend on user input, they may be
+ * incorrect if the operator is used from a script or from a special button. So only return the
+ * specialized descriptions if only the "type" is set, which conveys that the operator is meant
+ * to be used with the logic in the `invoke` method. */
+ if (RNA_struct_property_is_set(values, "type") &&
+ !RNA_struct_property_is_set(values, "use_extend") &&
+ !RNA_struct_property_is_set(values, "use_expand") &&
+ !RNA_struct_property_is_set(values, "action"))
+ switch (type) {
+ case SCE_SELECT_VERTEX:
+ return BLI_strdup(
+ N_("Vertex select - Shift-Click for multiple modes, Ctrl-Click contracts selection"));
+ case SCE_SELECT_EDGE:
+ return BLI_strdup(
+ N_("Edge select - Shift-Click for multiple modes, "
+ "Ctrl-Click expands/contracts selection depending on the current mode"));
+ case SCE_SELECT_FACE:
+ return BLI_strdup(
+ N_("Face select - Shift-Click for multiple modes, Ctrl-Click expands selection"));
+ }
+
+ return NULL;
+}
+
void MESH_OT_select_mode(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -1409,6 +1442,7 @@ void MESH_OT_select_mode(wmOperatorType *ot)
ot->invoke = edbm_select_mode_invoke;
ot->exec = edbm_select_mode_exec;
ot->poll = ED_operator_editmesh;
+ ot->get_description = edbm_select_mode_get_description;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 607ca110d0f..7f872c9b1af 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -52,8 +52,6 @@
#include "view3d_intern.h"
-static void do_view3d_header_buttons(bContext *C, void *arg, int event);
-
#define B_SEL_VERT 110
#define B_SEL_EDGE 111
#define B_SEL_FACE 112
@@ -98,101 +96,45 @@ void VIEW3D_OT_toggle_matcap_flip(wmOperatorType *ot)
/** \name UI Templates
* \{ */
-static void do_view3d_header_buttons(bContext *C, void *UNUSED(arg), int event)
-{
- wmWindow *win = CTX_wm_window(C);
- const int ctrl = win->eventstate->ctrl, shift = win->eventstate->shift;
-
- /* watch it: if area->win does not exist, check that when calling direct drawing routines */
-
- switch (event) {
- case B_SEL_VERT:
- if (EDBM_selectmode_toggle_multi(C, SCE_SELECT_VERTEX, -1, shift, ctrl)) {
- ED_undo_push(C, "Selectmode Set: Vertex");
- }
- break;
- case B_SEL_EDGE:
- if (EDBM_selectmode_toggle_multi(C, SCE_SELECT_EDGE, -1, shift, ctrl)) {
- ED_undo_push(C, "Selectmode Set: Edge");
- }
- break;
- case B_SEL_FACE:
- if (EDBM_selectmode_toggle_multi(C, SCE_SELECT_FACE, -1, shift, ctrl)) {
- ED_undo_push(C, "Selectmode Set: Face");
- }
- break;
- default:
- break;
- }
-}
-
void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
- uiBlock *block = uiLayoutGetBlock(layout);
-
- UI_block_func_handle_set(block, do_view3d_header_buttons, NULL);
-
- if (obedit && (obedit->type == OB_MESH)) {
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- uiLayout *row;
- uiBut *but;
-
- row = uiLayoutRow(layout, true);
- block = uiLayoutGetBlock(row);
- but = uiDefIconButBitS(
- block,
- UI_BTYPE_TOGGLE,
- SCE_SELECT_VERTEX,
- B_SEL_VERT,
- ICON_VERTEXSEL,
- 0,
- 0,
- UI_UNIT_X,
- UI_UNIT_Y,
- &em->selectmode,
- 1.0,
- 0.0,
- 0,
- 0,
- TIP_("Vertex select - Shift-Click for multiple modes, Ctrl-Click contracts selection"));
- UI_but_flag_disable(but, UI_BUT_UNDO);
- but = uiDefIconButBitS(
- block,
- UI_BTYPE_TOGGLE,
- SCE_SELECT_EDGE,
- B_SEL_EDGE,
- ICON_EDGESEL,
- 0,
- 0,
- ceilf(UI_UNIT_X - U.pixelsize),
- UI_UNIT_Y,
- &em->selectmode,
- 1.0,
- 0.0,
- 0,
- 0,
- TIP_("Edge select - Shift-Click for multiple modes, "
- "Ctrl-Click expands/contracts selection depending on the current mode"));
- UI_but_flag_disable(but, UI_BUT_UNDO);
- but = uiDefIconButBitS(
- block,
- UI_BTYPE_TOGGLE,
- SCE_SELECT_FACE,
- B_SEL_FACE,
- ICON_FACESEL,
- 0,
- 0,
- ceilf(UI_UNIT_X - U.pixelsize),
- UI_UNIT_Y,
- &em->selectmode,
- 1.0,
- 0.0,
- 0,
- 0,
- TIP_("Face select - Shift-Click for multiple modes, Ctrl-Click expands selection"));
- UI_but_flag_disable(but, UI_BUT_UNDO);
+ if (!obedit || obedit->type != OB_MESH) {
+ return;
}
+
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ uiLayout *row = uiLayoutRow(layout, true);
+
+ PointerRNA op_ptr;
+ wmOperatorType *ot = WM_operatortype_find("MESH_OT_select_mode", true);
+ uiItemFullO_ptr(row,
+ ot,
+ "",
+ ICON_VERTEXSEL,
+ NULL,
+ WM_OP_INVOKE_DEFAULT,
+ (em->selectmode & SCE_SELECT_VERTEX) ? UI_ITEM_O_DEPRESS : 0,
+ &op_ptr);
+ RNA_enum_set(&op_ptr, "type", SCE_SELECT_VERTEX);
+ uiItemFullO_ptr(row,
+ ot,
+ "",
+ ICON_EDGESEL,
+ NULL,
+ WM_OP_INVOKE_DEFAULT,
+ (em->selectmode & SCE_SELECT_EDGE) ? UI_ITEM_O_DEPRESS : 0,
+ &op_ptr);
+ RNA_enum_set(&op_ptr, "type", SCE_SELECT_EDGE);
+ uiItemFullO_ptr(row,
+ ot,
+ "",
+ ICON_FACESEL,
+ NULL,
+ WM_OP_INVOKE_DEFAULT,
+ (em->selectmode & SCE_SELECT_FACE) ? UI_ITEM_O_DEPRESS : 0,
+ &op_ptr);
+ RNA_enum_set(&op_ptr, "type", SCE_SELECT_FACE);
}
static void uiTemplatePaintModeSelection(uiLayout *layout, struct bContext *C)