Blender  V3.3
eyedropper_driver.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2009 Blender Foundation. All rights reserved. */
3 
13 #include "MEM_guardedalloc.h"
14 
15 #include "DNA_anim_types.h"
16 #include "DNA_object_types.h"
17 #include "DNA_screen_types.h"
18 
19 #include "BKE_animsys.h"
20 #include "BKE_context.h"
21 
22 #include "DEG_depsgraph.h"
23 #include "DEG_depsgraph_build.h"
24 
25 #include "RNA_access.h"
26 #include "RNA_define.h"
27 #include "RNA_path.h"
28 
29 #include "UI_interface.h"
30 
31 #include "WM_api.h"
32 #include "WM_types.h"
33 
34 #include "ED_keyframing.h"
35 
36 #include "eyedropper_intern.h"
37 #include "interface_intern.h"
38 
39 typedef struct DriverDropper {
40  /* Destination property (i.e. where we'll add a driver) */
43  int index;
44  bool is_undo;
45 
46  /* TODO: new target? */
48 
50 {
51  DriverDropper *ddr = MEM_callocN(sizeof(DriverDropper), __func__);
52 
53  uiBut *but = UI_context_active_but_prop_get(C, &ddr->ptr, &ddr->prop, &ddr->index);
54 
55  if ((ddr->ptr.data == NULL) || (ddr->prop == NULL) ||
56  (RNA_property_editable(&ddr->ptr, ddr->prop) == false) ||
57  (RNA_property_animateable(&ddr->ptr, ddr->prop) == false) || (but->flag & UI_BUT_DRIVEN)) {
58  MEM_freeN(ddr);
59  return false;
60  }
61  op->customdata = ddr;
62 
64 
65  return true;
66 }
67 
69 {
71 
73 }
74 
75 static void driverdropper_sample(bContext *C, wmOperator *op, const wmEvent *event)
76 {
79 
80  const short mapping_type = RNA_enum_get(op->ptr, "mapping_type");
81  const short flag = 0;
82 
83  /* we can only add a driver if we know what RNA property it corresponds to */
84  if (but == NULL) {
85  return;
86  }
87  /* Get paths for the source. */
88  PointerRNA *target_ptr = &but->rnapoin;
89  PropertyRNA *target_prop = but->rnaprop;
90  const int target_index = but->rnaindex;
91 
92  char *target_path = RNA_path_from_ID_to_property(target_ptr, target_prop);
93 
94  /* Get paths for the destination. */
95  char *dst_path = RNA_path_from_ID_to_property(&ddr->ptr, ddr->prop);
96 
97  /* Now create driver(s) */
98  if (target_path && dst_path) {
99  int success = ANIM_add_driver_with_target(op->reports,
100  ddr->ptr.owner_id,
101  dst_path,
102  ddr->index,
103  target_ptr->owner_id,
104  target_path,
105  target_index,
106  flag,
108  mapping_type);
109 
110  if (success) {
111  /* send updates */
116  }
117  }
118 
119  /* cleanup */
120  if (target_path) {
121  MEM_freeN(target_path);
122  }
123  if (dst_path) {
124  MEM_freeN(dst_path);
125  }
126 }
127 
129 {
130  driverdropper_exit(C, op);
131 }
132 
133 /* main modal status check */
134 static int driverdropper_modal(bContext *C, wmOperator *op, const wmEvent *event)
135 {
136  DriverDropper *ddr = op->customdata;
137 
138  /* handle modal keymap */
139  if (event->type == EVT_MODAL_MAP) {
140  switch (event->val) {
141  case EYE_MODAL_CANCEL: {
142  driverdropper_cancel(C, op);
143  return OPERATOR_CANCELLED;
144  }
146  const bool is_undo = ddr->is_undo;
147  driverdropper_sample(C, op, event);
148  driverdropper_exit(C, op);
149  /* Could support finished & undo-skip. */
150  return is_undo ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
151  }
152  }
153  }
154 
155  return OPERATOR_RUNNING_MODAL;
156 }
157 
158 /* Modal Operator init */
159 static int driverdropper_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
160 {
161  /* init */
162  if (driverdropper_init(C, op)) {
163  wmWindow *win = CTX_wm_window(C);
164  /* Workaround for de-activating the button clearing the cursor, see T76794 */
167 
168  /* add temp handler */
170 
171  return OPERATOR_RUNNING_MODAL;
172  }
173  return OPERATOR_CANCELLED;
174 }
175 
176 /* Repeat operator */
178 {
179  /* init */
180  if (driverdropper_init(C, op)) {
181  /* cleanup */
182  driverdropper_exit(C, op);
183 
184  return OPERATOR_FINISHED;
185  }
186  return OPERATOR_CANCELLED;
187 }
188 
190 {
191  if (!CTX_wm_window(C)) {
192  return false;
193  }
194  return true;
195 }
196 
198 {
199  /* identifiers */
200  ot->name = "Eyedropper Driver";
201  ot->idname = "UI_OT_eyedropper_driver";
202  ot->description = "Pick a property to use as a driver target";
203 
204  /* api callbacks */
210 
211  /* flags */
213 
214  /* properties */
216  "mapping_type",
218  0,
219  "Mapping Type",
220  "Method used to match target and driven properties");
221 }
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:749
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1074
struct wmWindow * CTX_wm_window(const bContext *C)
Definition: context.c:723
#define UNUSED(x)
void DEG_id_tag_update(struct ID *id, int flag)
void DEG_relations_tag_update(struct Main *bmain)
@ ID_RECALC_TRANSFORM
Definition: DNA_ID.h:771
@ ID_RECALC_GEOMETRY
Definition: DNA_ID.h:791
@ DRIVER_TYPE_PYTHON
Object is a sort of wrapper for general info.
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
@ OPERATOR_RUNNING_MODAL
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
#define C
Definition: RandGen.cpp:25
@ UI_BUT_UNDO
Definition: UI_interface.h:205
@ UI_BUT_DRIVEN
Definition: UI_interface.h:200
void UI_context_active_but_clear(struct bContext *C, struct wmWindow *win, struct ARegion *region)
uiBut * UI_context_active_but_prop_get(const struct bContext *C, struct PointerRNA *r_ptr, struct PropertyRNA **r_prop, int *r_index)
void UI_context_update_anim_flag(const struct bContext *C)
bool UI_but_flag_is_set(uiBut *but, int flag)
Definition: interface.cc:5868
@ OPTYPE_INTERNAL
Definition: WM_types.h:168
@ OPTYPE_BLOCKING
Definition: WM_types.h:150
@ OPTYPE_UNDO
Definition: WM_types.h:148
#define NC_ANIMATION
Definition: WM_types.h:338
#define ND_FCURVES_ORDER
Definition: WM_types.h:447
EnumPropertyItem prop_driver_create_mapping_types[]
Definition: drivers.c:835
int ANIM_add_driver_with_target(ReportList *reports, ID *dst_id, const char dst_path[], int dst_index, ID *src_id, const char src_path[], int src_index, short flag, int driver_type, short mapping_type)
Main Driver Management API calls.
Definition: drivers.c:281
static int driverdropper_exec(bContext *C, wmOperator *op)
struct DriverDropper DriverDropper
static void driverdropper_sample(bContext *C, wmOperator *op, const wmEvent *event)
static void driverdropper_cancel(bContext *C, wmOperator *op)
static bool driverdropper_init(bContext *C, wmOperator *op)
void UI_OT_eyedropper_driver(wmOperatorType *ot)
static void driverdropper_exit(bContext *C, wmOperator *op)
static bool driverdropper_poll(bContext *C)
static int driverdropper_modal(bContext *C, wmOperator *op, const wmEvent *event)
static int driverdropper_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
uiBut * eyedropper_get_property_button_under_mouse(bContext *C, const wmEvent *event)
@ EYE_MODAL_CANCEL
@ EYE_MODAL_SAMPLE_CONFIRM
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
bool RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop)
Definition: rna_access.c:1966
bool RNA_property_animateable(const PointerRNA *ptr, PropertyRNA *prop)
Definition: rna_access.c:1993
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3783
char * RNA_path_from_ID_to_property(const PointerRNA *ptr, PropertyRNA *prop)
Definition: rna_path.cc:1127
PropertyRNA * prop
void * data
Definition: RNA_types.h:38
struct ID * owner_id
Definition: RNA_types.h:36
short val
Definition: WM_types.h:680
short type
Definition: WM_types.h:678
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:919
const char * name
Definition: WM_types.h:888
int(* modal)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:935
const char * idname
Definition: WM_types.h:890
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:943
void(* cancel)(struct bContext *, struct wmOperator *)
Definition: WM_types.h:927
struct StructRNA * srna
Definition: WM_types.h:969
const char * description
Definition: WM_types.h:893
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:903
struct ReportList * reports
struct PointerRNA * ptr
void WM_cursor_modal_set(wmWindow *win, int val)
Definition: wm_cursors.c:191
void WM_cursor_modal_restore(wmWindow *win)
Definition: wm_cursors.c:200
@ WM_CURSOR_EYEDROPPER
Definition: wm_cursors.h:35
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
@ EVT_MODAL_MAP
wmOperatorType * ot
Definition: wm_files.c:3479