Blender V4.3
wm_gizmo_group.cc File Reference
#include <cstdlib>
#include <cstring>
#include "MEM_guardedalloc.h"
#include "BLI_buffer.h"
#include "BLI_listbase.h"
#include "BLI_rect.h"
#include "BLI_string.h"
#include "BKE_context.hh"
#include "BKE_main.hh"
#include "BKE_report.hh"
#include "BKE_workspace.hh"
#include "RNA_access.hh"
#include "RNA_define.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "wm_event_system.hh"
#include "ED_screen.hh"
#include "ED_undo.hh"
#include "wm_gizmo_intern.hh"
#include "wm_gizmo_wmapi.hh"

Go to the source code of this file.

Classes

struct  GizmoTweakData
 

Functions

wmGizmoGroup
wmGizmoGroupwm_gizmogroup_new_from_type (wmGizmoMap *gzmap, wmGizmoGroupType *gzgt)
 
wmGizmoGroupwm_gizmogroup_find_by_type (const wmGizmoMap *gzmap, const wmGizmoGroupType *gzgt)
 
void wm_gizmogroup_free (bContext *C, wmGizmoGroup *gzgroup)
 
void WM_gizmo_group_tag_remove (wmGizmoGroup *gzgroup)
 
void wm_gizmogroup_gizmo_register (wmGizmoGroup *gzgroup, wmGizmo *gz)
 
int WM_gizmo_cmp_temp_fl (const void *gz_a_ptr, const void *gz_b_ptr)
 
int WM_gizmo_cmp_temp_fl_reverse (const void *gz_a_ptr, const void *gz_b_ptr)
 
static bool wm_gizmo_keymap_uses_event_modifier (wmWindowManager *wm, const wmGizmoGroup *gzgroup, wmGizmo *gz, const int event_modifier, int *r_gzgroup_keymap_uses_modifier)
 
wmGizmowm_gizmogroup_find_intersected_gizmo (wmWindowManager *wm, const wmGizmoGroup *gzgroup, bContext *C, const int event_modifier, const int mval[2], int *r_part)
 
void wm_gizmogroup_intersectable_gizmos_to_list (wmWindowManager *wm, const wmGizmoGroup *gzgroup, const int event_modifier, BLI_Buffer *visible_gizmos)
 
void WM_gizmogroup_ensure_init (const bContext *C, wmGizmoGroup *gzgroup)
 
void WM_gizmo_group_remove_by_tool (bContext *C, Main *bmain, const wmGizmoGroupType *gzgt, const bToolRef *tref)
 
bool wm_gizmogroup_is_visible_in_drawstep (const wmGizmoGroup *gzgroup, const eWM_GizmoFlagMapDrawStep drawstep)
 
bool wm_gizmogroup_is_any_selected (const wmGizmoGroup *gzgroup)
 
Gizmo Operators

Basic operators for gizmo interaction with user configurable keymaps.

static int gizmo_select_invoke (bContext *C, wmOperator *op, const wmEvent *)
 
void GIZMOGROUP_OT_gizmo_select (wmOperatorType *ot)
 
static bool gizmo_tweak_start (bContext *C, wmGizmoMap *gzmap, wmGizmo *gz, const wmEvent *event)
 
static bool gizmo_tweak_start_and_finish (bContext *C, wmGizmoMap *gzmap, wmGizmo *gz, const wmEvent *event, bool *r_is_modal)
 
static void gizmo_tweak_finish (bContext *C, wmOperator *op, const bool cancel, bool clear_modal)
 
static int gizmo_tweak_modal (bContext *C, wmOperator *op, const wmEvent *event)
 
static int gizmo_tweak_invoke (bContext *C, wmOperator *op, const wmEvent *event)
 
void GIZMOGROUP_OT_gizmo_tweak (wmOperatorType *ot)
 
wmKeyMapwm_gizmogroup_tweak_modal_keymap (wmKeyConfig *keyconf)
 
wmGizmoGroup (Key-map callbacks)
wmKeyMapWM_gizmogroup_setup_keymap_generic (const wmGizmoGroupType *, wmKeyConfig *kc)
 
wmKeyMapWM_gizmogroup_setup_keymap_generic_drag (const wmGizmoGroupType *, wmKeyConfig *kc)
 
wmKeyMapWM_gizmogroup_setup_keymap_generic_maybe_drag (const wmGizmoGroupType *, wmKeyConfig *kc)
 
static wmKeyMapWM_gizmogroup_keymap_template_select_ex (wmKeyConfig *kc, const char *name, const wmGizmoMapType_Params *params)
 
wmKeyMapWM_gizmogroup_setup_keymap_generic_select (const wmGizmoGroupType *, wmKeyConfig *kc)
 
wmGizmo (Key-map access)

Key config version so these can be called from wmGizmoGroupFnSetupKeymap.

wmKeyMapWM_gizmo_keymap_generic_with_keyconfig (wmKeyConfig *kc)
 
wmKeyMapWM_gizmo_keymap_generic (wmWindowManager *wm)
 
wmKeyMapWM_gizmo_keymap_generic_select_with_keyconfig (wmKeyConfig *kc)
 
wmKeyMapWM_gizmo_keymap_generic_select (wmWindowManager *wm)
 
wmKeyMapWM_gizmo_keymap_generic_drag_with_keyconfig (wmKeyConfig *kc)
 
wmKeyMapWM_gizmo_keymap_generic_drag (wmWindowManager *wm)
 
wmKeyMapWM_gizmo_keymap_generic_click_drag_with_keyconfig (wmKeyConfig *kc)
 
wmKeyMapWM_gizmo_keymap_generic_click_drag (wmWindowManager *wm)
 
wmKeyMapWM_gizmo_keymap_generic_maybe_drag_with_keyconfig (wmKeyConfig *kc)
 
wmKeyMapWM_gizmo_keymap_generic_maybe_drag (wmWindowManager *wm)
 
wmGizmoGroupType
wmGizmoGroupTypeRefWM_gizmomaptype_group_find_ptr (wmGizmoMapType *gzmap_type, const wmGizmoGroupType *gzgt)
 
wmGizmoGroupTypeRefWM_gizmomaptype_group_find (wmGizmoMapType *gzmap_type, const char *idname)
 
wmGizmoGroupTypeRefWM_gizmomaptype_group_link (wmGizmoMapType *gzmap_type, const char *idname)
 
wmGizmoGroupTypeRefWM_gizmomaptype_group_link_ptr (wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt)
 
void WM_gizmomaptype_group_init_runtime_keymap (const Main *bmain, wmGizmoGroupType *gzgt)
 
void WM_gizmomaptype_group_init_runtime (const Main *bmain, wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt)
 
wmGizmoGroupWM_gizmomaptype_group_init_runtime_with_region (wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt, ARegion *region)
 
void WM_gizmomaptype_group_free (wmGizmoGroupTypeRef *gzgt_ref)
 
void WM_gizmomaptype_group_unlink (bContext *C, Main *bmain, wmGizmoMapType *gzmap_type, const wmGizmoGroupType *gzgt)
 
void wm_gizmogrouptype_setup_keymap (wmGizmoGroupType *gzgt, wmKeyConfig *keyconf)
 
High Level Add/Remove API

For use directly from operators & RNA registration.

Note
In context of gizmo API these names are a bit misleading, but for general use terms its OK. WM_gizmo_group_type_add would be more correctly called: WM_gizmomaptype_grouptype_reference_link but for general purpose API this is too detailed & annoying.
We may want to return a value if there is nothing to remove.
void WM_gizmo_group_type_add_ptr_ex (wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type)
 
void WM_gizmo_group_type_add_ptr (wmGizmoGroupType *gzgt)
 
void WM_gizmo_group_type_add (const char *idname)
 
bool WM_gizmo_group_type_ensure_ptr_ex (wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type)
 
bool WM_gizmo_group_type_ensure_ptr (wmGizmoGroupType *gzgt)
 
bool WM_gizmo_group_type_ensure (const char *idname)
 
void WM_gizmo_group_type_remove_ptr_ex (Main *bmain, wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type)
 
void WM_gizmo_group_type_remove_ptr (Main *bmain, wmGizmoGroupType *gzgt)
 
void WM_gizmo_group_type_remove (Main *bmain, const char *idname)
 
void WM_gizmo_group_type_reinit_ptr_ex (Main *bmain, wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type)
 
void WM_gizmo_group_type_reinit_ptr (Main *bmain, wmGizmoGroupType *gzgt)
 
void WM_gizmo_group_type_reinit (Main *bmain, const char *idname)
 
void WM_gizmo_group_type_unlink_delayed_ptr_ex (wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type)
 
void WM_gizmo_group_type_unlink_delayed_ptr (wmGizmoGroupType *gzgt)
 
void WM_gizmo_group_type_unlink_delayed (const char *idname)
 
void WM_gizmo_group_unlink_delayed_ptr_from_space (wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type, ScrArea *area)
 
Gizmo Group Type Callback Wrappers
bool WM_gizmo_group_type_poll (const bContext *C, const wmGizmoGroupType *gzgt)
 
void WM_gizmo_group_refresh (const bContext *C, wmGizmoGroup *gzgroup)
 

Function Documentation

◆ gizmo_select_invoke()

◆ gizmo_tweak_finish()

◆ gizmo_tweak_invoke()

◆ gizmo_tweak_modal()

◆ gizmo_tweak_start()

static bool gizmo_tweak_start ( bContext * C,
wmGizmoMap * gzmap,
wmGizmo * gz,
const wmEvent * event )
static

Definition at line 404 of file wm_gizmo_group.cc.

References wmGizmo::state, WM_GIZMO_STATE_MODAL, and wm_gizmomap_modal_set().

Referenced by gizmo_tweak_invoke().

◆ gizmo_tweak_start_and_finish()

◆ GIZMOGROUP_OT_gizmo_select()

◆ GIZMOGROUP_OT_gizmo_tweak()

◆ WM_gizmo_cmp_temp_fl()

int WM_gizmo_cmp_temp_fl ( const void * gz_a_ptr,
const void * gz_b_ptr )

Definition at line 137 of file wm_gizmo_group.cc.

References wmGizmo::f, and wmGizmo::temp.

◆ WM_gizmo_cmp_temp_fl_reverse()

int WM_gizmo_cmp_temp_fl_reverse ( const void * gz_a_ptr,
const void * gz_b_ptr )

◆ WM_gizmo_group_refresh()

◆ WM_gizmo_group_remove_by_tool()

◆ WM_gizmo_group_tag_remove()

◆ WM_gizmo_group_type_add()

void WM_gizmo_group_type_add ( const char * idname)

◆ WM_gizmo_group_type_add_ptr()

void WM_gizmo_group_type_add_ptr ( wmGizmoGroupType * gzgt)

◆ WM_gizmo_group_type_add_ptr_ex()

◆ WM_gizmo_group_type_ensure()

bool WM_gizmo_group_type_ensure ( const char * idname)

◆ WM_gizmo_group_type_ensure_ptr()

◆ WM_gizmo_group_type_ensure_ptr_ex()

bool WM_gizmo_group_type_ensure_ptr_ex ( wmGizmoGroupType * gzgt,
wmGizmoMapType * gzmap_type )

◆ WM_gizmo_group_type_poll()

◆ WM_gizmo_group_type_reinit()

void WM_gizmo_group_type_reinit ( Main * bmain,
const char * idname )

◆ WM_gizmo_group_type_reinit_ptr()

◆ WM_gizmo_group_type_reinit_ptr_ex()

void WM_gizmo_group_type_reinit_ptr_ex ( Main * bmain,
wmGizmoGroupType * gzgt,
wmGizmoMapType * gzmap_type )

Has the result of unlinking and linking (re-initializes gizmo's).

Definition at line 1168 of file wm_gizmo_group.cc.

References BLI_assert, UNUSED_VARS_NDEBUG, WM_gizmo_group_type_add_ptr_ex(), WM_gizmomaptype_group_find_ptr(), and WM_gizmomaptype_group_unlink().

Referenced by WM_gizmo_group_type_reinit_ptr().

◆ WM_gizmo_group_type_remove()

void WM_gizmo_group_type_remove ( Main * bmain,
const char * idname )

◆ WM_gizmo_group_type_remove_ptr()

void WM_gizmo_group_type_remove_ptr ( Main * bmain,
wmGizmoGroupType * gzgt )

◆ WM_gizmo_group_type_remove_ptr_ex()

void WM_gizmo_group_type_remove_ptr_ex ( Main * bmain,
wmGizmoGroupType * gzgt,
wmGizmoMapType * gzmap_type )

Call WM_gizmo_group_type_free_ptr after to remove & free.

Definition at line 1150 of file wm_gizmo_group.cc.

References WM_gizmomaptype_group_unlink().

Referenced by WM_gizmo_group_type_remove_ptr().

◆ WM_gizmo_group_type_unlink_delayed()

void WM_gizmo_group_type_unlink_delayed ( const char * idname)

◆ WM_gizmo_group_type_unlink_delayed_ptr()

◆ WM_gizmo_group_type_unlink_delayed_ptr_ex()

void WM_gizmo_group_type_unlink_delayed_ptr_ex ( wmGizmoGroupType * gzgt,
wmGizmoMapType * gzmap_type )

◆ WM_gizmo_group_unlink_delayed_ptr_from_space()

void WM_gizmo_group_unlink_delayed_ptr_from_space ( wmGizmoGroupType * gzgt,
wmGizmoMapType * gzmap_type,
ScrArea * area )

◆ WM_gizmo_keymap_generic()

wmKeyMap * WM_gizmo_keymap_generic ( wmWindowManager * wm)

◆ WM_gizmo_keymap_generic_click_drag()

wmKeyMap * WM_gizmo_keymap_generic_click_drag ( wmWindowManager * wm)

◆ WM_gizmo_keymap_generic_click_drag_with_keyconfig()

wmKeyMap * WM_gizmo_keymap_generic_click_drag_with_keyconfig ( wmKeyConfig * kc)

Definition at line 904 of file wm_gizmo_group.cc.

References RGN_TYPE_WINDOW, SPACE_EMPTY, and WM_keymap_ensure().

Referenced by WM_gizmo_keymap_generic_click_drag().

◆ WM_gizmo_keymap_generic_drag()

wmKeyMap * WM_gizmo_keymap_generic_drag ( wmWindowManager * wm)

◆ WM_gizmo_keymap_generic_drag_with_keyconfig()

wmKeyMap * WM_gizmo_keymap_generic_drag_with_keyconfig ( wmKeyConfig * kc)

◆ WM_gizmo_keymap_generic_maybe_drag()

wmKeyMap * WM_gizmo_keymap_generic_maybe_drag ( wmWindowManager * wm)

◆ WM_gizmo_keymap_generic_maybe_drag_with_keyconfig()

wmKeyMap * WM_gizmo_keymap_generic_maybe_drag_with_keyconfig ( wmKeyConfig * kc)

Drag or press depending on preference.

Definition at line 914 of file wm_gizmo_group.cc.

References RGN_TYPE_WINDOW, SPACE_EMPTY, and WM_keymap_ensure().

Referenced by WM_gizmo_keymap_generic_maybe_drag(), and WM_gizmogroup_setup_keymap_generic_maybe_drag().

◆ WM_gizmo_keymap_generic_select()

wmKeyMap * WM_gizmo_keymap_generic_select ( wmWindowManager * wm)

◆ WM_gizmo_keymap_generic_select_with_keyconfig()

wmKeyMap * WM_gizmo_keymap_generic_select_with_keyconfig ( wmKeyConfig * kc)

Definition at line 884 of file wm_gizmo_group.cc.

References RGN_TYPE_WINDOW, SPACE_EMPTY, and WM_keymap_ensure().

Referenced by WM_gizmo_keymap_generic_select().

◆ WM_gizmo_keymap_generic_with_keyconfig()

wmKeyMap * WM_gizmo_keymap_generic_with_keyconfig ( wmKeyConfig * kc)

◆ wm_gizmo_keymap_uses_event_modifier()

static bool wm_gizmo_keymap_uses_event_modifier ( wmWindowManager * wm,
const wmGizmoGroup * gzgroup,
wmGizmo * gz,
const int event_modifier,
int * r_gzgroup_keymap_uses_modifier )
static

◆ WM_gizmogroup_ensure_init()

◆ wm_gizmogroup_find_by_type()

wmGizmoGroup * wm_gizmogroup_find_by_type ( const wmGizmoMap * gzmap,
const wmGizmoGroupType * gzgt )

Definition at line 67 of file wm_gizmo_group.cc.

References BLI_findptr(), wmGizmoMap::groups, and offsetof.

◆ wm_gizmogroup_find_intersected_gizmo()

wmGizmo * wm_gizmogroup_find_intersected_gizmo ( wmWindowManager * wm,
const wmGizmoGroup * gzgroup,
bContext * C,
const int event_modifier,
const int mval[2],
int * r_part )

◆ wm_gizmogroup_free()

◆ wm_gizmogroup_gizmo_register()

void wm_gizmogroup_gizmo_register ( wmGizmoGroup * gzgroup,
wmGizmo * gz )

Add gizmo to gzgroup and make sure its name is unique within the group.

Definition at line 130 of file wm_gizmo_group.cc.

References BLI_addtail(), BLI_assert, BLI_findindex(), wmGizmoGroup::gizmos, and wmGizmo::parent_gzgroup.

Referenced by wm_gizmo_register().

◆ wm_gizmogroup_intersectable_gizmos_to_list()

void wm_gizmogroup_intersectable_gizmos_to_list ( wmWindowManager * wm,
const wmGizmoGroup * gzgroup,
int event_modifier,
BLI_Buffer * visible_gizmos )

Adds all gizmos of gzgroup that can be selected to the head of listbase. Added items need freeing!

Definition at line 214 of file wm_gizmo_group.cc.

References BLI_buffer_append, wmGizmoGroupType::flag, wmGizmoGroup::gizmos, LISTBASE_FOREACH_BACKWARD, wmGizmoGroup::type, WM_GIZMO_HIDDEN, WM_GIZMO_HIDDEN_SELECT, wm_gizmo_keymap_uses_event_modifier(), and WM_GIZMOGROUPTYPE_3D.

Referenced by wm_gizmomap_highlight_find().

◆ wm_gizmogroup_is_any_selected()

bool wm_gizmogroup_is_any_selected ( const wmGizmoGroup * gzgroup)

◆ wm_gizmogroup_is_visible_in_drawstep()

bool wm_gizmogroup_is_visible_in_drawstep ( const wmGizmoGroup * gzgroup,
const eWM_GizmoFlagMapDrawStep drawstep )

◆ WM_gizmogroup_keymap_template_select_ex()

static wmKeyMap * WM_gizmogroup_keymap_template_select_ex ( wmKeyConfig * kc,
const char * name,
const wmGizmoMapType_Params * params )
static

Variation of #WM_gizmogroup_keymap_common but with keymap items for selection

TODO(@ideasman42): move to Python.

Parameters
nameTypically wmGizmoGroupType.name
paramsTypically wmGizmoGroupType.gzmap_params

Definition at line 790 of file wm_gizmo_group.cc.

References BLI_listbase_is_empty(), wmKeyMap::items, KM_ANY, KM_CLICK_DRAG, KM_PRESS, KM_SHIFT, LEFTMOUSE, params, wmKeyMapItem::ptr, RIGHTMOUSE, RNA_boolean_set(), USER_LMOUSESELECT, WM_keymap_add_item(), and WM_keymap_ensure().

Referenced by WM_gizmogroup_setup_keymap_generic_select().

◆ wm_gizmogroup_new_from_type()

wmGizmoGroup * wm_gizmogroup_new_from_type ( wmGizmoMap * gzmap,
wmGizmoGroupType * gzgt )

◆ WM_gizmogroup_setup_keymap_generic()

wmKeyMap * WM_gizmogroup_setup_keymap_generic ( const wmGizmoGroupType * gzgt,
wmKeyConfig * kc )

◆ WM_gizmogroup_setup_keymap_generic_drag()

wmKeyMap * WM_gizmogroup_setup_keymap_generic_drag ( const wmGizmoGroupType * gzgt,
wmKeyConfig * kc )

Definition at line 770 of file wm_gizmo_group.cc.

References WM_gizmo_keymap_generic_drag_with_keyconfig().

◆ WM_gizmogroup_setup_keymap_generic_maybe_drag()

◆ WM_gizmogroup_setup_keymap_generic_select()

wmKeyMap * WM_gizmogroup_setup_keymap_generic_select ( const wmGizmoGroupType * gzgt,
wmKeyConfig * kc )

◆ wm_gizmogroup_tweak_modal_keymap()

◆ wm_gizmogrouptype_setup_keymap()

◆ WM_gizmomaptype_group_find()

wmGizmoGroupTypeRef * WM_gizmomaptype_group_find ( wmGizmoMapType * gzmap_type,
const char * idname )

Definition at line 942 of file wm_gizmo_group.cc.

References wmGizmoMapType::grouptype_refs, LISTBASE_FOREACH, and STREQ.

◆ WM_gizmomaptype_group_find_ptr()

◆ WM_gizmomaptype_group_free()

void WM_gizmomaptype_group_free ( wmGizmoGroupTypeRef * gzgt_ref)

Unlike WM_gizmomaptype_group_unlink this doesn't maintain correct state, simply free.

Definition at line 1030 of file wm_gizmo_group.cc.

References MEM_freeN().

Referenced by WM_gizmomaptype_group_unlink(), and wm_gizmomaptypes_free().

◆ WM_gizmomaptype_group_init_runtime()

void WM_gizmomaptype_group_init_runtime ( const Main * bmain,
wmGizmoMapType * gzmap_type,
wmGizmoGroupType * gzgt )

◆ WM_gizmomaptype_group_init_runtime_keymap()

void WM_gizmomaptype_group_init_runtime_keymap ( const Main * bmain,
wmGizmoGroupType * gzgt )

Definition at line 970 of file wm_gizmo_group.cc.

References ListBase::first, Main::wm, and wm_gizmogrouptype_setup_keymap().

Referenced by WM_gizmoconfig_update().

◆ WM_gizmomaptype_group_init_runtime_with_region()

◆ WM_gizmomaptype_group_link()

wmGizmoGroupTypeRef * WM_gizmomaptype_group_link ( wmGizmoMapType * gzmap_type,
const char * idname )

Use this for registering gizmos on startup. For runtime, use #WM_gizmomaptype_group_link_runtime.

Definition at line 953 of file wm_gizmo_group.cc.

References BLI_assert, WM_gizmogrouptype_find(), and WM_gizmomaptype_group_link_ptr().

◆ WM_gizmomaptype_group_link_ptr()

◆ WM_gizmomaptype_group_unlink()