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:
authorCampbell Barton <ideasman42@gmail.com>2019-01-23 08:14:52 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-01-23 08:14:52 +0300
commitbe24da0a984a503da8f0588fd302cbeff03c6951 (patch)
tree9d44f2c4413a81cad5db729a1802662a5c4936aa /source/blender/windowmanager/gizmo
parent7ce38978aea12bd912f46eed836f8210ec0cf03e (diff)
Gizmo: add support for gizmos to initialize from the active tool
Diffstat (limited to 'source/blender/windowmanager/gizmo')
-rw-r--r--source/blender/windowmanager/gizmo/WM_gizmo_api.h2
-rw-r--r--source/blender/windowmanager/gizmo/WM_gizmo_types.h3
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo.c18
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c2
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c2
5 files changed, 25 insertions, 2 deletions
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_api.h b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
index 667646cf601..2a4f6b344a9 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_api.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
@@ -83,6 +83,8 @@ struct wmGizmoOpElem *WM_gizmo_operator_get(
struct PointerRNA *WM_gizmo_operator_set(
struct wmGizmo *gz, int part_index,
struct wmOperatorType *ot, struct IDProperty *properties);
+int WM_gizmo_operator_invoke(
+ struct bContext *C, struct wmGizmo *gz, struct wmGizmoOpElem *gzop);
/* callbacks */
void WM_gizmo_set_fn_custom_modal(struct wmGizmo *gz, wmGizmoFnModal fn);
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_types.h b/source/blender/windowmanager/gizmo/WM_gizmo_types.h
index c92172dff15..ee574d26750 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_types.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_types.h
@@ -87,6 +87,9 @@ typedef enum eWM_GizmoFlag {
WM_GIZMO_MOVE_CURSOR = (1 << 7),
/** Don't write into the depth buffer when selecting. */
WM_GIZMO_SELECT_BACKGROUND = (1 << 8),
+
+ /** Use the active tools operator properties when running as an operator. */
+ WM_GIZMO_OPERATOR_TOOL_INIT = (1 << 9),
} eWM_GizmoFlag;
/**
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
index 0bef33a8855..00586816933 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
@@ -48,6 +48,7 @@
#include "BKE_idprop.h"
#include "WM_api.h"
+#include "WM_toolsystem.h"
#include "WM_types.h"
#include "ED_screen.h"
@@ -271,6 +272,23 @@ PointerRNA *WM_gizmo_operator_set(
return &gzop->ptr;
}
+int WM_gizmo_operator_invoke(bContext *C, wmGizmo *gz, wmGizmoOpElem *gzop)
+{
+ if (gz->flag & WM_GIZMO_OPERATOR_TOOL_INIT) {
+ /* Merge toolsettings into the gizmo properties. */
+ PointerRNA tref_ptr;
+ bToolRef *tref = WM_toolsystem_ref_from_context(C);
+ if (tref && WM_toolsystem_ref_properties_get_from_operator(tref, gzop->type, &tref_ptr)) {
+ if (gzop->ptr.data == NULL) {
+ IDPropertyTemplate val = {0};
+ gzop->ptr.data = IDP_New(IDP_GROUP, &val, "wmOperatorProperties");
+ }
+ IDP_MergeGroup(gzop->ptr.data, tref_ptr.data, false);
+ }
+ }
+ return WM_operator_name_call_ptr(C, gzop->type, WM_OP_INVOKE_DEFAULT, &gzop->ptr);
+}
+
static void wm_gizmo_set_matrix_rotation_from_z_axis__internal(
float matrix[4][4], const float z_axis[3])
{
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
index 89df826617b..8483b251cec 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
@@ -404,7 +404,7 @@ static bool gizmo_tweak_start_and_finish(
gz->parent_gzgroup->type->invoke_prepare(C, gz->parent_gzgroup, gz);
}
/* Allow for 'button' gizmos, single click to run an action. */
- WM_operator_name_call_ptr(C, gzop->type, WM_OP_INVOKE_DEFAULT, &gzop->ptr);
+ WM_gizmo_operator_invoke(C, gz, gzop);
}
return true;
}
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
index 68c736404e8..26355151a40 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
@@ -971,7 +971,7 @@ void wm_gizmomap_modal_set(
struct wmGizmoOpElem *gzop = WM_gizmo_operator_get(gz, gz->highlight_part);
if (gzop && gzop->type) {
- const int retval = WM_operator_name_call_ptr(C, gzop->type, WM_OP_INVOKE_DEFAULT, &gzop->ptr);
+ const int retval = WM_gizmo_operator_invoke(C, gz, gzop);
if ((retval & OPERATOR_RUNNING_MODAL) == 0) {
wm_gizmomap_modal_set(gzmap, C, gz, event, false);
}