Gizmo: Functions to re-initialize a group type
Partially re-initializing a gizmo is often more trouble then removing and re-adding.
This commit is contained in:
		@@ -380,17 +380,10 @@ static int add_primitive_cube_gizmo_invoke(bContext *C, wmOperator *op, const wm
 | 
			
		||||
	if (ret & OPERATOR_FINISHED) {
 | 
			
		||||
		/* Setup gizmos */
 | 
			
		||||
		if (v3d && ((v3d->gizmo_flag & V3D_GIZMO_HIDE) == 0)) {
 | 
			
		||||
			ARegion *ar = CTX_wm_region(C);
 | 
			
		||||
			wmGizmoMap *gzmap = ar->gizmo_map;
 | 
			
		||||
			wmGizmoGroupType *gzgt = WM_gizmogrouptype_find("MESH_GGT_add_bounds", false);
 | 
			
		||||
			wmGizmoGroup *gzgroup = WM_gizmomap_group_find_ptr(gzmap, gzgt);
 | 
			
		||||
			if (gzgroup != NULL) {
 | 
			
		||||
				GizmoPlacementGroup *ggd = gzgroup->customdata;
 | 
			
		||||
				ggd->data.op = op;
 | 
			
		||||
				gizmo_mesh_placement_modal_from_setup(C, gzgroup);
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				WM_gizmo_group_type_ensure_ptr(gzgt);
 | 
			
		||||
			if (!WM_gizmo_group_type_ensure_ptr(gzgt)) {
 | 
			
		||||
				struct Main *bmain = CTX_data_main(C);
 | 
			
		||||
				WM_gizmo_group_type_reinit_ptr(bmain, gzgt);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -314,12 +314,12 @@ void WM_gizmo_group_type_add_ptr(
 | 
			
		||||
        struct wmGizmoGroupType *gzgt);
 | 
			
		||||
void WM_gizmo_group_type_add(const char *idname);
 | 
			
		||||
 | 
			
		||||
void WM_gizmo_group_type_ensure_ptr_ex(
 | 
			
		||||
bool WM_gizmo_group_type_ensure_ptr_ex(
 | 
			
		||||
        struct wmGizmoGroupType *gzgt,
 | 
			
		||||
        struct wmGizmoMapType *gzmap_type);
 | 
			
		||||
void WM_gizmo_group_type_ensure_ptr(
 | 
			
		||||
bool WM_gizmo_group_type_ensure_ptr(
 | 
			
		||||
        struct wmGizmoGroupType *gzgt);
 | 
			
		||||
void WM_gizmo_group_type_ensure(const char *idname);
 | 
			
		||||
bool WM_gizmo_group_type_ensure(const char *idname);
 | 
			
		||||
 | 
			
		||||
void WM_gizmo_group_type_remove_ptr_ex(
 | 
			
		||||
        struct Main *bmain, struct wmGizmoGroupType *gzgt,
 | 
			
		||||
@@ -335,6 +335,14 @@ void WM_gizmo_group_type_unlink_delayed_ptr(
 | 
			
		||||
        struct wmGizmoGroupType *gzgt);
 | 
			
		||||
void WM_gizmo_group_type_unlink_delayed(const char *idname);
 | 
			
		||||
 | 
			
		||||
/* Has the result of unlinking and linking (re-initializes gizmo's). */
 | 
			
		||||
void WM_gizmo_group_type_reinit_ptr_ex(
 | 
			
		||||
        struct Main *bmain, struct wmGizmoGroupType *gzgt,
 | 
			
		||||
        struct wmGizmoMapType *gzmap_type);
 | 
			
		||||
void WM_gizmo_group_type_reinit_ptr(
 | 
			
		||||
        struct Main *bmain, struct wmGizmoGroupType *gzgt);
 | 
			
		||||
void WM_gizmo_group_type_reinit(struct Main *bmain, const char *idname);
 | 
			
		||||
 | 
			
		||||
/* Utilities */
 | 
			
		||||
bool WM_gizmo_context_check_drawstep(const struct bContext *C, eWM_GizmoFlagMapDrawStep step);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -879,26 +879,28 @@ void WM_gizmo_group_type_add(const char *idname)
 | 
			
		||||
	WM_gizmo_group_type_add_ptr(gzgt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WM_gizmo_group_type_ensure_ptr_ex(
 | 
			
		||||
bool WM_gizmo_group_type_ensure_ptr_ex(
 | 
			
		||||
        wmGizmoGroupType *gzgt,
 | 
			
		||||
        wmGizmoMapType *gzmap_type)
 | 
			
		||||
{
 | 
			
		||||
	wmGizmoGroupTypeRef *gzgt_ref = WM_gizmomaptype_group_find_ptr(gzmap_type, gzgt);
 | 
			
		||||
	if (gzgt_ref == NULL) {
 | 
			
		||||
		WM_gizmo_group_type_add_ptr_ex(gzgt, gzmap_type);
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
void WM_gizmo_group_type_ensure_ptr(
 | 
			
		||||
bool WM_gizmo_group_type_ensure_ptr(
 | 
			
		||||
        wmGizmoGroupType *gzgt)
 | 
			
		||||
{
 | 
			
		||||
	wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params);
 | 
			
		||||
	WM_gizmo_group_type_ensure_ptr_ex(gzgt, gzmap_type);
 | 
			
		||||
	return WM_gizmo_group_type_ensure_ptr_ex(gzgt, gzmap_type);
 | 
			
		||||
}
 | 
			
		||||
void WM_gizmo_group_type_ensure(const char *idname)
 | 
			
		||||
bool WM_gizmo_group_type_ensure(const char *idname)
 | 
			
		||||
{
 | 
			
		||||
	wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
 | 
			
		||||
	BLI_assert(gzgt != NULL);
 | 
			
		||||
	WM_gizmo_group_type_ensure_ptr(gzgt);
 | 
			
		||||
	return WM_gizmo_group_type_ensure_ptr(gzgt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WM_gizmo_group_type_remove_ptr_ex(
 | 
			
		||||
@@ -921,6 +923,28 @@ void WM_gizmo_group_type_remove(struct Main *bmain, const char *idname)
 | 
			
		||||
	WM_gizmo_group_type_remove_ptr(bmain, gzgt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WM_gizmo_group_type_reinit_ptr_ex(
 | 
			
		||||
        struct Main *bmain, wmGizmoGroupType *gzgt,
 | 
			
		||||
        wmGizmoMapType *gzmap_type)
 | 
			
		||||
{
 | 
			
		||||
	wmGizmoGroupTypeRef *gzgt_ref = WM_gizmomaptype_group_find_ptr(gzmap_type, gzgt);
 | 
			
		||||
	BLI_assert(gzgt_ref != NULL);
 | 
			
		||||
	WM_gizmomaptype_group_unlink(NULL, bmain, gzmap_type, gzgt);
 | 
			
		||||
	WM_gizmo_group_type_add_ptr_ex(gzgt, gzmap_type);
 | 
			
		||||
}
 | 
			
		||||
void WM_gizmo_group_type_reinit_ptr(
 | 
			
		||||
        struct Main *bmain, wmGizmoGroupType *gzgt)
 | 
			
		||||
{
 | 
			
		||||
	wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params);
 | 
			
		||||
	WM_gizmo_group_type_reinit_ptr_ex(bmain, gzgt, gzmap_type);
 | 
			
		||||
}
 | 
			
		||||
void WM_gizmo_group_type_reinit(struct Main *bmain, const char *idname)
 | 
			
		||||
{
 | 
			
		||||
	wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
 | 
			
		||||
	BLI_assert(gzgt != NULL);
 | 
			
		||||
	WM_gizmo_group_type_reinit_ptr(bmain, gzgt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* delayed versions */
 | 
			
		||||
 | 
			
		||||
void WM_gizmo_group_type_unlink_delayed_ptr_ex(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user