Blender V4.5
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
13
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) */
41 PropertyRNA *prop = nullptr;
42 int index = 0;
43 bool is_undo = false;
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 */
120 }
121 }
122}
123
125{
127}
128
129/* main modal status check */
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);
145 /* Could support finished & undo-skip. */
146 return is_undo ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
147 }
148 }
149 }
150
152}
153
154/* Modal Operator init */
156 wmOperator *op,
157 const wmEvent * /*event*/)
158{
159 /* init */
160 if (driverdropper_init(C, op)) {
161 wmWindow *win = CTX_wm_window(C);
162 /* Workaround for de-activating the button clearing the cursor, see #76794 */
165
166 /* add temp handler */
168
170 }
171 return OPERATOR_CANCELLED;
172}
173
174/* Repeat operator */
176{
177 /* init */
178 if (driverdropper_init(C, op)) {
179 /* cleanup */
181
182 return OPERATOR_FINISHED;
183 }
184 return OPERATOR_CANCELLED;
185}
186
188{
189 if (!CTX_wm_window(C)) {
190 return false;
191 }
192 return true;
193}
194
196{
197 /* identifiers */
198 ot->name = "Eyedropper Driver";
199 ot->idname = "UI_OT_eyedropper_driver";
200 ot->description = "Pick a property to use as a driver target";
201
202 /* API callbacks. */
203 ot->invoke = driverdropper_invoke;
204 ot->modal = driverdropper_modal;
205 ot->cancel = driverdropper_cancel;
206 ot->exec = driverdropper_exec;
207 ot->poll = driverdropper_poll;
208
209 /* flags */
211
212 /* properties */
213 RNA_def_enum(ot->srna,
214 "mapping_type",
216 0,
217 "Mapping Type",
218 "Method used to match target and driven properties");
219}
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:962
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:982
@ DRIVER_TYPE_PYTHON
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
@ OPERATOR_RUNNING_MODAL
Read Guarded memory(de)allocation.
#define C
Definition RandGen.cpp:29
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)
@ UI_BUT_UNDO
@ UI_BUT_DRIVEN
bool UI_but_flag_is_set(uiBut *but, int flag)
#define NC_ANIMATION
Definition WM_types.hh:385
#define ND_FCURVES_ORDER
Definition WM_types.hh:496
@ OPTYPE_INTERNAL
Definition WM_types.hh:202
@ OPTYPE_BLOCKING
Definition WM_types.hh:184
@ OPTYPE_UNDO
Definition WM_types.hh:182
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:284
const EnumPropertyItem prop_driver_create_mapping_types[]
Definition drivers.cc:827
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 wmOperatorStatus driverdropper_modal(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus driverdropper_exec(bContext *C, wmOperator *op)
static wmOperatorStatus driverdropper_invoke(bContext *C, wmOperator *op, const wmEvent *)
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:1173
PropertyRNA * prop
ID * owner_id
Definition RNA_types.hh:51
void * data
Definition RNA_types.hh:53
PropertyRNA * rnaprop
PointerRNA rnapoin
wmEventType type
Definition WM_types.hh:754
short val
Definition WM_types.hh:756
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:36
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:4226
uint8_t flag
Definition wm_window.cc:139