Blender V4.3
eyedropper_driver.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2009 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
14#include "MEM_guardedalloc.h"
15
16#include "DNA_anim_types.h"
17#include "DNA_screen_types.h"
18
19#include "BKE_context.hh"
20
21#include "DEG_depsgraph.hh"
23
24#include "RNA_access.hh"
25#include "RNA_define.hh"
26#include "RNA_path.hh"
27
28#include "UI_interface.hh"
29
30#include "WM_api.hh"
31#include "WM_types.hh"
32
33#include "ED_keyframing.hh"
34
35#include "eyedropper_intern.hh"
36#include "interface_intern.hh"
37
39 /* Destination property (i.e. where we'll add a driver) */
42 int index;
43 bool is_undo;
44
45 /* TODO: new target? */
46};
47
49{
50 DriverDropper *ddr = MEM_new<DriverDropper>(__func__);
51
52 uiBut *but = UI_context_active_but_prop_get(C, &ddr->ptr, &ddr->prop, &ddr->index);
53
54 if ((ddr->ptr.data == nullptr) || (ddr->prop == nullptr) ||
55 (RNA_property_driver_editable(&ddr->ptr, ddr->prop) == false) || (but->flag & UI_BUT_DRIVEN))
56 {
57 MEM_delete(ddr);
58 return false;
59 }
60 op->customdata = ddr;
61
63
64 return true;
65}
66
68{
70
71 if (op->customdata) {
72 DriverDropper *ddr = static_cast<DriverDropper *>(op->customdata);
73 op->customdata = nullptr;
74 MEM_delete(ddr);
75 }
76}
77
78static void driverdropper_sample(bContext *C, wmOperator *op, const wmEvent *event)
79{
80 DriverDropper *ddr = static_cast<DriverDropper *>(op->customdata);
82
83 const short mapping_type = RNA_enum_get(op->ptr, "mapping_type");
84 const short flag = 0;
85
86 /* we can only add a driver if we know what RNA property it corresponds to */
87 if (but == nullptr) {
88 return;
89 }
90 /* Get paths for the source. */
91 PointerRNA *target_ptr = &but->rnapoin;
92 PropertyRNA *target_prop = but->rnaprop;
93 const int target_index = but->rnaindex;
94
95 const std::optional<std::string> target_path = RNA_path_from_ID_to_property(target_ptr,
96 target_prop);
97
98 /* Get paths for the destination. */
99 const std::optional<std::string> dst_path = RNA_path_from_ID_to_property(&ddr->ptr, ddr->prop);
100
101 /* Now create driver(s) */
102 if (target_path && dst_path) {
103 int success = ANIM_add_driver_with_target(op->reports,
104 ddr->ptr.owner_id,
105 dst_path->c_str(),
106 ddr->index,
107 target_ptr->owner_id,
108 target_path->c_str(),
109 target_index,
110 flag,
112 mapping_type);
113
114 if (success) {
115 /* send updates */
119 WM_event_add_notifier(C, NC_ANIMATION | ND_FCURVES_ORDER, nullptr); /* XXX */
120 }
121 }
122}
123
125{
126 driverdropper_exit(C, op);
127}
128
129/* main modal status check */
130static int driverdropper_modal(bContext *C, wmOperator *op, const wmEvent *event)
131{
132 DriverDropper *ddr = static_cast<DriverDropper *>(op->customdata);
133
134 /* handle modal keymap */
135 if (event->type == EVT_MODAL_MAP) {
136 switch (event->val) {
137 case EYE_MODAL_CANCEL: {
139 return OPERATOR_CANCELLED;
140 }
142 const bool is_undo = ddr->is_undo;
143 driverdropper_sample(C, op, event);
144 driverdropper_exit(C, op);
145 /* Could support finished & undo-skip. */
146 return is_undo ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
147 }
148 }
149 }
150
152}
153
154/* Modal Operator init */
155static int driverdropper_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
156{
157 /* init */
158 if (driverdropper_init(C, op)) {
159 wmWindow *win = CTX_wm_window(C);
160 /* Workaround for de-activating the button clearing the cursor, see #76794 */
163
164 /* add temp handler */
166
168 }
169 return OPERATOR_CANCELLED;
170}
171
172/* Repeat operator */
174{
175 /* init */
176 if (driverdropper_init(C, op)) {
177 /* cleanup */
178 driverdropper_exit(C, op);
179
180 return OPERATOR_FINISHED;
181 }
182 return OPERATOR_CANCELLED;
183}
184
186{
187 if (!CTX_wm_window(C)) {
188 return false;
189 }
190 return true;
191}
192
194{
195 /* identifiers */
196 ot->name = "Eyedropper Driver";
197 ot->idname = "UI_OT_eyedropper_driver";
198 ot->description = "Pick a property to use as a driver target";
199
200 /* api callbacks */
206
207 /* flags */
209
210 /* properties */
212 "mapping_type",
214 0,
215 "Mapping Type",
216 "Method used to match target and driven properties");
217}
wmWindow * CTX_wm_window(const bContext *C)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_TRANSFORM
Definition DNA_ID.h:1021
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1041
@ DRIVER_TYPE_PYTHON
@ OPERATOR_RUNNING_MODAL
Read Guarded memory(de)allocation.
void UI_context_update_anim_flag(const bContext *C)
uiBut * UI_context_active_but_prop_get(const bContext *C, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
void UI_context_active_but_clear(bContext *C, wmWindow *win, ARegion *region)
bool UI_but_flag_is_set(uiBut *but, int flag)
@ UI_BUT_UNDO
@ UI_BUT_DRIVEN
@ OPTYPE_INTERNAL
Definition WM_types.hh:182
@ OPTYPE_BLOCKING
Definition WM_types.hh:164
@ OPTYPE_UNDO
Definition WM_types.hh:162
#define NC_ANIMATION
Definition WM_types.hh:355
#define ND_FCURVES_ORDER
Definition WM_types.hh:466
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.cc:285
const EnumPropertyItem prop_driver_create_mapping_types[]
Definition drivers.cc:828
static int driverdropper_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int driverdropper_exec(bContext *C, wmOperator *op)
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)
uiBut * eyedropper_get_property_button_under_mouse(bContext *C, const wmEvent *event)
@ EYE_MODAL_CANCEL
@ EYE_MODAL_SAMPLE_CONFIRM
bool RNA_property_driver_editable(const PointerRNA *ptr, PropertyRNA *prop)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
std::optional< std::string > RNA_path_from_ID_to_property(const PointerRNA *ptr, PropertyRNA *prop)
Definition rna_path.cc:1166
PropertyRNA * prop
ID * owner_id
Definition RNA_types.hh:40
void * data
Definition RNA_types.hh:42
PropertyRNA * rnaprop
PointerRNA rnapoin
short val
Definition WM_types.hh:724
short type
Definition WM_types.hh:722
const char * name
Definition WM_types.hh:990
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1042
const char * idname
Definition WM_types.hh:992
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1036
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1022
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1006
const char * description
Definition WM_types.hh:996
StructRNA * srna
Definition WM_types.hh:1080
void(* cancel)(bContext *C, wmOperator *op)
Definition WM_types.hh:1028
struct ReportList * reports
struct PointerRNA * ptr
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
@ WM_CURSOR_EYEDROPPER
Definition wm_cursors.hh: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.cc:4125
uint8_t flag
Definition wm_window.cc:138