diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_operators.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 274 |
1 files changed, 62 insertions, 212 deletions
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 81dcc5ccea0..6c9b0af5186 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -116,13 +116,10 @@ #define UNDOCUMENTED_OPERATOR_TIP N_("(undocumented operator)") -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Operator API * \{ */ -/* SOME_OT_op -> some.op */ void WM_operator_py_idname(char *to, const char *from) { const char *sep = strstr(from, "_OT_"); @@ -143,7 +140,6 @@ void WM_operator_py_idname(char *to, const char *from) } } -/* some.op -> SOME_OT_op */ void WM_operator_bl_idname(char *to, const char *from) { if (from) { @@ -167,10 +163,6 @@ void WM_operator_bl_idname(char *to, const char *from) } } -/** - * Sanity check to ensure #WM_operator_bl_idname won't fail. - * \returns true when there are no problems with \a idname, otherwise report an error. - */ bool WM_operator_py_idname_ok_or_report(ReportList *reports, const char *classname, const char *idname) @@ -219,15 +211,6 @@ bool WM_operator_py_idname_ok_or_report(ReportList *reports, return true; } -/** - * Print a string representation of the operator, - * with the args that it runs so python can run it again. - * - * When calling from an existing wmOperator, better to use simple version: - * `WM_operator_pystring(C, op);` - * - * \note Both \a op and \a opptr may be `NULL` (\a op is only used for macro operators). - */ char *WM_operator_pystring_ex(bContext *C, wmOperator *op, const bool all_args, @@ -308,9 +291,6 @@ char *WM_operator_pystring(bContext *C, wmOperator *op, const bool all_args, con return WM_operator_pystring_ex(C, op, all_args, macro_args, op->type, op->ptr); } -/** - * \return true if the string was shortened - */ bool WM_operator_pystring_abbreviate(char *str, int str_len_max) { const int str_len = strlen(str); @@ -423,7 +403,9 @@ static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr * `object.data.bones["Bones"].use_deform` such paths are not useful for key-shortcuts, * so this function supports returning data-paths directly to context members that aren't ID types. */ -static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr, bool *r_is_id) +static const char *wm_context_member_from_ptr(const bContext *C, + const PointerRNA *ptr, + bool *r_is_id) { const char *member_id = NULL; bool is_id = false; @@ -541,50 +523,52 @@ static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr case ID_SCR: { CTX_TEST_PTR_ID(C, "screen", ptr->owner_id); - SpaceLink *space_data = CTX_wm_space_data(C); - - TEST_PTR_DATA_TYPE("space_data", RNA_Space, ptr, space_data); TEST_PTR_DATA_TYPE("area", RNA_Area, ptr, CTX_wm_area(C)); TEST_PTR_DATA_TYPE("region", RNA_Region, ptr, CTX_wm_region(C)); - switch (space_data->spacetype) { - case SPACE_VIEW3D: { - const View3D *v3d = (View3D *)space_data; - const View3DShading *shading = &v3d->shading; + SpaceLink *space_data = CTX_wm_space_data(C); + if (space_data != NULL) { + TEST_PTR_DATA_TYPE("space_data", RNA_Space, ptr, space_data); - TEST_PTR_DATA_TYPE("space_data.overlay", RNA_View3DOverlay, ptr, v3d); - TEST_PTR_DATA_TYPE("space_data.shading", RNA_View3DShading, ptr, shading); - break; - } - case SPACE_GRAPH: { - const SpaceGraph *sipo = (SpaceGraph *)space_data; - const bDopeSheet *ads = sipo->ads; - TEST_PTR_DATA_TYPE("space_data.dopesheet", RNA_DopeSheet, ptr, ads); - break; - } - case SPACE_FILE: { - const SpaceFile *sfile = (SpaceFile *)space_data; - const FileSelectParams *params = ED_fileselect_get_active_params(sfile); - TEST_PTR_DATA_TYPE("space_data.params", RNA_FileSelectParams, ptr, params); - break; - } - case SPACE_IMAGE: { - const SpaceImage *sima = (SpaceImage *)space_data; - TEST_PTR_DATA_TYPE("space_data.overlay", RNA_SpaceImageOverlay, ptr, sima); - TEST_PTR_DATA_TYPE("space_data.uv_editor", RNA_SpaceUVEditor, ptr, sima); - break; - } - case SPACE_NLA: { - const SpaceNla *snla = (SpaceNla *)space_data; - const bDopeSheet *ads = snla->ads; - TEST_PTR_DATA_TYPE("space_data.dopesheet", RNA_DopeSheet, ptr, ads); - break; - } - case SPACE_ACTION: { - const SpaceAction *sact = (SpaceAction *)space_data; - const bDopeSheet *ads = &sact->ads; - TEST_PTR_DATA_TYPE("space_data.dopesheet", RNA_DopeSheet, ptr, ads); - break; + switch (space_data->spacetype) { + case SPACE_VIEW3D: { + const View3D *v3d = (View3D *)space_data; + const View3DShading *shading = &v3d->shading; + + TEST_PTR_DATA_TYPE("space_data.overlay", RNA_View3DOverlay, ptr, v3d); + TEST_PTR_DATA_TYPE("space_data.shading", RNA_View3DShading, ptr, shading); + break; + } + case SPACE_GRAPH: { + const SpaceGraph *sipo = (SpaceGraph *)space_data; + const bDopeSheet *ads = sipo->ads; + TEST_PTR_DATA_TYPE("space_data.dopesheet", RNA_DopeSheet, ptr, ads); + break; + } + case SPACE_FILE: { + const SpaceFile *sfile = (SpaceFile *)space_data; + const FileSelectParams *params = ED_fileselect_get_active_params(sfile); + TEST_PTR_DATA_TYPE("space_data.params", RNA_FileSelectParams, ptr, params); + break; + } + case SPACE_IMAGE: { + const SpaceImage *sima = (SpaceImage *)space_data; + TEST_PTR_DATA_TYPE("space_data.overlay", RNA_SpaceImageOverlay, ptr, sima); + TEST_PTR_DATA_TYPE("space_data.uv_editor", RNA_SpaceUVEditor, ptr, sima); + break; + } + case SPACE_NLA: { + const SpaceNla *snla = (SpaceNla *)space_data; + const bDopeSheet *ads = snla->ads; + TEST_PTR_DATA_TYPE("space_data.dopesheet", RNA_DopeSheet, ptr, ads); + break; + } + case SPACE_ACTION: { + const SpaceAction *sact = (SpaceAction *)space_data; + const bDopeSheet *ads = &sact->ads; + TEST_PTR_DATA_TYPE("space_data.dopesheet", RNA_DopeSheet, ptr, ads); + break; + } } } @@ -604,10 +588,7 @@ static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr } #endif -/** - * Calculate the path to `ptr` from context `C`, or return NULL if it can't be calculated. - */ -char *WM_context_path_resolve_property_full(bContext *C, +char *WM_context_path_resolve_property_full(const bContext *C, const PointerRNA *ptr, PropertyRNA *prop, int index) @@ -707,8 +688,6 @@ void WM_operator_properties_create(PointerRNA *ptr, const char *opstring) } } -/* similar to the function above except its uses ID properties - * used for keymaps and macros */ void WM_operator_properties_alloc(PointerRNA **ptr, IDProperty **properties, const char *opstring) { IDProperty *tmp_properties = NULL; @@ -759,14 +738,6 @@ void WM_operator_properties_sanitize(PointerRNA *ptr, const bool no_context) RNA_STRUCT_END; } -/** - * Set all props to their default. - * - * \param do_update: Only update un-initialized props. - * - * \note There's nothing specific to operators here. - * This could be made a general function. - */ bool WM_operator_properties_default(PointerRNA *ptr, const bool do_update) { bool changed = false; @@ -794,7 +765,6 @@ bool WM_operator_properties_default(PointerRNA *ptr, const bool do_update) return changed; } -/* remove all props without PROP_SKIP_SAVE */ void WM_operator_properties_reset(wmOperator *op) { if (op->ptr->data) { @@ -941,13 +911,6 @@ bool WM_operator_last_properties_store(wmOperator *UNUSED(op)) /** \name Default Operator Callbacks * \{ */ -/** - * Helper to get select and tweak-transform to work conflict free and as desired. See - * #WM_operator_properties_generic_select() for details. - * - * To be used together with #WM_generic_select_invoke() and - * #WM_operator_properties_generic_select(). - */ int WM_generic_select_modal(bContext *C, wmOperator *op, const wmEvent *event) { PropertyRNA *wait_to_deselect_prop = RNA_struct_find_property(op->ptr, @@ -1008,13 +971,6 @@ int WM_generic_select_modal(bContext *C, wmOperator *op, const wmEvent *event) return OPERATOR_RUNNING_MODAL | OPERATOR_PASS_THROUGH; } -/** - * Helper to get select and tweak-transform to work conflict free and as desired. See - * #WM_operator_properties_generic_select() for details. - * - * To be used together with #WM_generic_select_modal() and - * #WM_operator_properties_generic_select(). - */ int WM_generic_select_invoke(bContext *C, wmOperator *op, const wmEvent *event) { RNA_int_set(op->ptr, "mouse_x", event->mval[0]); @@ -1059,8 +1015,7 @@ int WM_operator_smooth_viewtx_get(const wmOperator *op) return (op->flag & OP_IS_INVOKE) ? U.smooth_viewtx : 0; } -/* invoke callback, uses enum property named "type" */ -int WM_menu_invoke_ex(bContext *C, wmOperator *op, int opcontext) +int WM_menu_invoke_ex(bContext *C, wmOperator *op, wmOperatorCallContext opcontext) { PropertyRNA *prop = op->type->prop; @@ -1180,10 +1135,6 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *region, void *arg) return block; } -/** - * Similar to #WM_enum_search_invoke, but draws previews. Also, this can't - * be used as invoke callback directly since it needs additional info. - */ int WM_enum_search_invoke_previews(bContext *C, wmOperator *op, short prv_cols, short prv_rows) { static struct EnumSearchMenu search_menu; @@ -1206,13 +1157,12 @@ int WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(eve return OPERATOR_INTERFACE; } -/* Can't be used as an invoke directly, needs message arg (can be NULL) */ int WM_operator_confirm_message_ex(bContext *C, wmOperator *op, const char *title, const int icon, const char *message, - const short opcontext) + const wmOperatorCallContext opcontext) { IDProperty *properties = op->ptr->data; @@ -1251,7 +1201,6 @@ int WM_operator_confirm_or_exec(bContext *C, wmOperator *op, const wmEvent *UNUS return op->type->exec(C, op); } -/* op->invoke, opens fileselect if path property not set, otherwise executes */ int WM_operator_filesel(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { if (RNA_struct_property_is_set(op->ptr, "filepath")) { @@ -1276,7 +1225,6 @@ bool WM_operator_filesel_ensure_ext_imtype(wmOperator *op, const struct ImageFor return false; } -/* op->poll */ bool WM_operator_winactive(bContext *C) { if (CTX_wm_window(C) == NULL) { @@ -1285,7 +1233,6 @@ bool WM_operator_winactive(bContext *C) return 1; } -/* return false, if the UI should be disabled */ bool WM_operator_check_ui_enabled(const bContext *C, const char *idname) { wmWindowManager *wm = CTX_wm_manager(C); @@ -1323,9 +1270,6 @@ void WM_operator_last_properties_ensure(wmOperatorType *ot, PointerRNA *ptr) RNA_pointer_create(G_MAIN->wm.first, ot->srna, props, ptr); } -/** - * Use for drag & drop a path or name with operators invoke() function. - */ ID *WM_operator_drop_load_path(struct bContext *C, wmOperator *op, const short idcode) { Main *bmain = CTX_data_main(C); @@ -1629,20 +1573,11 @@ static int wm_operator_props_popup_ex(bContext *C, return OPERATOR_RUNNING_MODAL; } -/** - * Same as #WM_operator_props_popup but don't use operator redo. - * just wraps #WM_operator_props_dialog_popup. - */ int WM_operator_props_popup_confirm(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { return wm_operator_props_popup_ex(C, op, false, false); } -/** - * Same as #WM_operator_props_popup but call the operator first, - * This way - the button values correspond to the result of the operator. - * Without this, first access to a button will make the result jump, see T32452. - */ int WM_operator_props_popup_call(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { return wm_operator_props_popup_ex(C, op, true, true); @@ -2270,11 +2205,8 @@ static void radial_control_set_initial_mouse(RadialControl *rc, const wmEvent *e float d[2] = {0, 0}; float zoom[2] = {1, 1}; - rc->initial_mouse[0] = event->x; - rc->initial_mouse[1] = event->y; - - rc->initial_co[0] = event->x; - rc->initial_co[1] = event->y; + copy_v2_v2_int(rc->initial_mouse, event->xy); + copy_v2_v2_int(rc->initial_co, event->xy); switch (rc->subtype) { case PROP_NONE: @@ -2950,14 +2882,12 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even if (!has_numInput) { if (rc->slow_mode) { if (rc->subtype == PROP_ANGLE) { - const float position[2] = {event->x, event->y}; - /* calculate the initial angle here first */ delta[0] = rc->initial_mouse[0] - rc->slow_mouse[0]; delta[1] = rc->initial_mouse[1] - rc->slow_mouse[1]; /* precision angle gets calculated from dial and gets added later */ - angle_precision = -0.1f * BLI_dial_angle(rc->dial, position); + angle_precision = -0.1f * BLI_dial_angle(rc->dial, (float[2]){UNPACK2(event->xy)}); } else { delta[0] = rc->initial_mouse[0] - rc->slow_mouse[0]; @@ -2970,7 +2900,7 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even dist = len_v2(delta); - delta[0] = event->x - rc->slow_mouse[0]; + delta[0] = event->xy[0] - rc->slow_mouse[0]; if (rc->zoom_prop) { delta[0] /= zoom[0]; @@ -2980,8 +2910,8 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even } } else { - delta[0] = rc->initial_mouse[0] - event->x; - delta[1] = rc->initial_mouse[1] - event->y; + delta[0] = (float)(rc->initial_mouse[0] - event->xy[0]); + delta[1] = (float)(rc->initial_mouse[1] - event->xy[1]); if (rc->zoom_prop) { RNA_property_float_get_array(&rc->zoom_ptr, rc->zoom_prop, zoom); delta[0] /= zoom[0]; @@ -3048,8 +2978,8 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even case EVT_LEFTSHIFTKEY: case EVT_RIGHTSHIFTKEY: { if (event->val == KM_PRESS) { - rc->slow_mouse[0] = event->x; - rc->slow_mouse[1] = event->y; + rc->slow_mouse[0] = event->xy[0]; + rc->slow_mouse[1] = event->xy[1]; rc->slow_mode = true; if (rc->subtype == PROP_ANGLE) { const float initial_position[2] = {UNPACK2(rc->initial_mouse)}; @@ -3760,87 +3690,6 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot) /** \} */ -#ifdef WITH_XR_OPENXR - -static void wm_xr_session_update_screen(Main *bmain, const wmXrData *xr_data) -{ - const bool session_exists = WM_xr_session_exists(xr_data); - - for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { - LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { - LISTBASE_FOREACH (SpaceLink *, slink, &area->spacedata) { - if (slink->spacetype == SPACE_VIEW3D) { - View3D *v3d = (View3D *)slink; - - if (v3d->flag & V3D_XR_SESSION_MIRROR) { - ED_view3d_xr_mirror_update(area, v3d, session_exists); - } - - if (session_exists) { - wmWindowManager *wm = bmain->wm.first; - const Scene *scene = WM_windows_scene_get_from_screen(wm, screen); - - ED_view3d_xr_shading_update(wm, v3d, scene); - } - /* Ensure no 3D View is tagged as session root. */ - else { - v3d->runtime.flag &= ~V3D_RUNTIME_XR_SESSION_ROOT; - } - } - } - } - } - - WM_main_add_notifier(NC_WM | ND_XR_DATA_CHANGED, NULL); -} - -static void wm_xr_session_update_screen_on_exit_cb(const wmXrData *xr_data) -{ - /* Just use G_MAIN here, storing main isn't reliable enough on file read or exit. */ - wm_xr_session_update_screen(G_MAIN, xr_data); -} - -static int wm_xr_session_toggle_exec(bContext *C, wmOperator *UNUSED(op)) -{ - Main *bmain = CTX_data_main(C); - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *win = CTX_wm_window(C); - View3D *v3d = CTX_wm_view3d(C); - - /* Lazy-create xr context - tries to dynlink to the runtime, reading active_runtime.json. */ - if (wm_xr_init(wm) == false) { - return OPERATOR_CANCELLED; - } - - v3d->runtime.flag |= V3D_RUNTIME_XR_SESSION_ROOT; - wm_xr_session_toggle(wm, win, wm_xr_session_update_screen_on_exit_cb); - wm_xr_session_update_screen(bmain, &wm->xr); - - WM_event_add_notifier(C, NC_WM | ND_XR_DATA_CHANGED, NULL); - - return OPERATOR_FINISHED; -} - -static void WM_OT_xr_session_toggle(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Toggle VR Session"; - ot->idname = "WM_OT_xr_session_toggle"; - ot->description = - "Open a view for use with virtual reality headsets, or close it if already " - "opened"; - - /* callbacks */ - ot->exec = wm_xr_session_toggle_exec; - ot->poll = ED_operator_view3d_active; - - /* XXX INTERNAL just to hide it from the search menu by default, an Add-on will expose it in the - * UI instead. Not meant as a permanent solution. */ - ot->flag = OPTYPE_INTERNAL; -} - -#endif /* WITH_XR_OPENXR */ - /* -------------------------------------------------------------------- */ /** \name Operator Registration & Keymaps * \{ */ @@ -3882,9 +3731,6 @@ void wm_operatortypes_register(void) WM_operatortype_append(WM_OT_call_panel); WM_operatortype_append(WM_OT_radial_control); WM_operatortype_append(WM_OT_stereo3d_set); -#ifdef WITH_XR_OPENXR - WM_operatortype_append(WM_OT_xr_session_toggle); -#endif #if defined(WIN32) WM_operatortype_append(WM_OT_console_toggle); #endif @@ -3892,6 +3738,10 @@ void wm_operatortypes_register(void) WM_operatortype_append(WM_OT_previews_clear); WM_operatortype_append(WM_OT_doc_view_manual_ui_context); +#ifdef WITH_XR_OPENXR + wm_xr_operatortypes_register(); +#endif + /* gizmos */ WM_operatortype_append(GIZMOGROUP_OT_gizmo_select); WM_operatortype_append(GIZMOGROUP_OT_gizmo_tweak); @@ -4080,7 +3930,6 @@ static void gesture_zoom_border_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_assign(keymap, "IMAGE_OT_view_zoom_border"); } -/* default keymap for windows and screens, only call once per WM */ void wm_window_keymap(wmKeyConfig *keyconf) { WM_keymap_ensure(keyconf, "Window", 0, 0); @@ -4148,7 +3997,8 @@ static const EnumPropertyItem *rna_id_itemf(bool *r_free, return item; } -/* can add more as needed */ +/* Can add more ID types as needed. */ + const EnumPropertyItem *RNA_action_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), |