Blender  V3.3
ed_util_ops.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
9 #include <cstring>
10 
11 #include "DNA_space_types.h"
13 
14 #include "BLI_fileops.h"
15 #include "BLI_utildefines.h"
16 
17 #include "BKE_context.h"
18 #include "BKE_icons.h"
19 #include "BKE_lib_id.h"
20 #include "BKE_lib_override.h"
21 #include "BKE_main.h"
22 #include "BKE_report.h"
23 
24 #include "BLT_translation.h"
25 
26 #include "ED_asset.h"
27 #include "ED_render.h"
28 #include "ED_undo.h"
29 #include "ED_util.h"
30 
31 #include "RNA_access.h"
32 #include "RNA_prototypes.h"
33 
34 #include "UI_interface.h"
35 
36 #include "WM_api.h"
37 #include "WM_types.h"
38 
39 /* -------------------------------------------------------------------- */
44 {
45  const PointerRNA idptr = CTX_data_pointer_get(C, "id");
46  BLI_assert(!idptr.data || RNA_struct_is_ID(idptr.type));
47 
48  const ID *id = (ID *)idptr.data;
49  if (!id) {
50  return false;
51  }
52  if (ID_IS_LINKED(id)) {
53  CTX_wm_operator_poll_msg_set(C, TIP_("Can't edit external library data"));
54  return false;
55  }
56  if (ID_IS_OVERRIDE_LIBRARY(id)) {
57  CTX_wm_operator_poll_msg_set(C, TIP_("Can't edit previews of overridden library data"));
58  return false;
59  }
60  if (!BKE_previewimg_id_get_p(id)) {
61  CTX_wm_operator_poll_msg_set(C, TIP_("Data-block does not support previews"));
62  return false;
63  }
64 
65  return true;
66 }
67 
69 {
70  char filepath[FILE_MAX];
71 
72  RNA_string_get(op->ptr, "filepath", filepath);
73 
74  if (!BLI_is_file(filepath)) {
75  BKE_reportf(op->reports, RPT_ERROR, "File not found '%s'", filepath);
76  return OPERATOR_CANCELLED;
77  }
78 
79  PointerRNA idptr = CTX_data_pointer_get(C, "id");
80  ID *id = (ID *)idptr.data;
81 
82  BKE_previewimg_id_custom_set(id, filepath);
83 
85 
86  return OPERATOR_FINISHED;
87 }
88 
90 {
91  ot->name = "Load Custom Preview";
92  ot->description = "Choose an image to help identify the data-block visually";
93  ot->idname = "ED_OT_lib_id_load_custom_preview";
94 
95  /* api callbacks */
99 
100  /* flags */
102 
105  FILE_SPECIAL,
110 }
111 
113 {
115  return false;
116  }
117 
118  const PointerRNA idptr = CTX_data_pointer_get(C, "id");
119  const ID *id = (ID *)idptr.data;
120  if (GS(id->name) == ID_NT) {
121  CTX_wm_operator_poll_msg_set(C, TIP_("Can't generate automatic preview for node group"));
122  return false;
123  }
124 
125  return true;
126 }
127 
129 {
130  PointerRNA idptr = CTX_data_pointer_get(C, "id");
131  ID *id = (ID *)idptr.data;
132 
134 
136  if (preview) {
138  }
139 
140  UI_icon_render_id(C, nullptr, id, ICON_SIZE_PREVIEW, true);
141 
144 
145  return OPERATOR_FINISHED;
146 }
147 
149 {
150  ot->name = "Generate Preview";
151  ot->description = "Create an automatic preview for the selected data-block";
152  ot->idname = "ED_OT_lib_id_generate_preview";
153 
154  /* api callbacks */
157 
158  /* flags */
160 }
161 
163 {
165  return false;
166  }
167  if (CTX_data_active_object(C) == nullptr) {
168  return false;
169  }
170  return true;
171 }
172 
174 {
175  PointerRNA idptr = CTX_data_pointer_get(C, "id");
176  ID *id = (ID *)idptr.data;
177 
179 
180  Object *object_to_render = CTX_data_active_object(C);
181 
183  PreviewImage *preview_image = BKE_previewimg_id_ensure(id);
184  UI_icon_render_id_ex(C, nullptr, &object_to_render->id, ICON_SIZE_PREVIEW, true, preview_image);
185 
188 
189  return OPERATOR_FINISHED;
190 }
191 
193 {
194  ot->name = "Generate Preview from Object";
195  ot->description = "Create a preview for this asset by rendering the active object";
196  ot->idname = "ED_OT_lib_id_generate_preview_from_object";
197 
198  /* api callbacks */
201 
202  /* flags */
204 }
205 
208 /* -------------------------------------------------------------------- */
213 {
214  PropertyPointerRNA pprop;
215  PointerRNA idptr = PointerRNA_NULL;
216 
218 
219  if (pprop.prop) {
220  idptr = RNA_property_pointer_get(&pprop.ptr, pprop.prop);
221  }
222 
223  if ((pprop.prop == nullptr) || RNA_pointer_is_null(&idptr) || !RNA_struct_is_ID(idptr.type)) {
224  BKE_report(
225  op->reports, RPT_ERROR, "Incorrect context for running data-block fake user toggling");
226  return OPERATOR_CANCELLED;
227  }
228 
229  ID *id = (ID *)idptr.data;
230 
232  (ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB, ID_WS))) {
233  BKE_report(op->reports, RPT_ERROR, "Data-block type does not support fake user");
234  return OPERATOR_CANCELLED;
235  }
236 
237  if (ID_FAKE_USERS(id)) {
238  id_fake_user_clear(id);
239  }
240  else {
241  id_fake_user_set(id);
242  }
243 
244  return OPERATOR_FINISHED;
245 }
246 
248 {
249  /* identifiers */
250  ot->name = "Toggle Fake User";
251  ot->description = "Save this data-block even if it has no users";
252  ot->idname = "ED_OT_lib_id_fake_user_toggle";
253 
254  /* api callbacks */
256 
257  /* flags */
259 }
260 
262 {
263  PropertyPointerRNA pprop;
264  PointerRNA idptr;
265 
267 
268  if (pprop.prop) {
269  idptr = RNA_property_pointer_get(&pprop.ptr, pprop.prop);
270  }
271 
272  if ((pprop.prop == nullptr) || RNA_pointer_is_null(&idptr) || !RNA_struct_is_ID(idptr.type)) {
273  BKE_report(
274  op->reports, RPT_ERROR, "Incorrect context for running data-block fake user toggling");
275  return OPERATOR_CANCELLED;
276  }
277 
278  memset(&idptr, 0, sizeof(idptr));
279  RNA_property_pointer_set(&pprop.ptr, pprop.prop, idptr, nullptr);
280  RNA_property_update(C, &pprop.ptr, pprop.prop);
281 
282  return OPERATOR_FINISHED;
283 }
284 
286 {
287  /* identifiers */
288  ot->name = "Unlink Data-Block";
289  ot->description = "Remove a usage of a data-block, clearing the assignment";
290  ot->idname = "ED_OT_lib_id_unlink";
291 
292  /* api callbacks */
294 
295  /* flags */
297 }
298 
300 {
301  const PointerRNA id_ptr = CTX_data_pointer_get_type(C, "id", &RNA_ID);
302  const ID *id = static_cast<ID *>(id_ptr.data);
303 
304  return id && ID_IS_OVERRIDE_LIBRARY_REAL(id) && !ID_IS_LINKED(id);
305 }
306 
308 {
309  Main *bmain = CTX_data_main(C);
310  const PointerRNA id_ptr = CTX_data_pointer_get_type(C, "id", &RNA_ID);
311  ID *id = static_cast<ID *>(id_ptr.data);
312 
313  const bool is_system_override = BKE_lib_override_library_is_system_defined(bmain, id);
314  if (is_system_override) {
315  /* A system override is not editable. Make it an editable (non-system-defined) one. */
316  id->override_library->flag &= ~IDOVERRIDE_LIBRARY_FLAG_SYSTEM_DEFINED;
317  }
318  else {
319  /* Reset override, which makes it non-editable (i.e. a system define override). */
320  BKE_lib_override_library_id_reset(bmain, id, true);
321  }
322 
324 
325  return OPERATOR_FINISHED;
326 }
327 
329 {
330  /* identifiers */
331  ot->name = "Toggle Library Override Editable";
332  ot->description = "Set if this library override data-block can be edited";
333  ot->idname = "ED_OT_lib_id_override_editable_toggle";
334 
335  /* api callbacks */
338 
339  /* flags */
341 }
342 
345 /* -------------------------------------------------------------------- */
350 {
351  Main *bmain = CTX_data_main(C);
352  ED_editors_flush_edits(bmain);
353  return OPERATOR_FINISHED;
354 }
355 
357 {
358  /* identifiers */
359  ot->name = "Flush Edits";
360  ot->description = "Flush edit data from active editing modes";
361  ot->idname = "ED_OT_flush_edits";
362 
363  /* api callbacks */
365 
366  /* flags */
368 }
369 
373 {
377 
381 
383 
389 }
PointerRNA CTX_data_pointer_get(const bContext *C, const char *member)
Definition: context.c:462
struct wmWindowManager * CTX_wm_manager(const bContext *C)
Definition: context.c:713
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
Definition: context.c:473
struct Object * CTX_data_active_object(const bContext *C)
Definition: context.c:1353
void CTX_wm_operator_poll_msg_set(struct bContext *C, const char *msg)
Definition: context.c:1042
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1074
struct PreviewImage * BKE_previewimg_id_ensure(struct ID *id)
Definition: icons.cc:385
void BKE_previewimg_id_free(struct ID *id)
Definition: icons.cc:377
void BKE_previewimg_clear(struct PreviewImage *prv)
Definition: icons.cc:303
struct PreviewImage ** BKE_previewimg_id_get_p(const struct ID *id)
struct PreviewImage * BKE_previewimg_id_get(const struct ID *id)
void BKE_previewimg_id_custom_set(struct ID *id, const char *filepath)
Definition: icons.cc:399
bool BKE_id_is_editable(const struct Main *bmain, const struct ID *id)
void id_fake_user_set(struct ID *id)
Definition: lib_id.c:343
void id_fake_user_clear(struct ID *id)
Definition: lib_id.c:351
void BKE_lib_override_library_id_reset(struct Main *bmain, struct ID *id_root, bool do_reset_system_override)
bool BKE_lib_override_library_is_system_defined(const struct Main *bmain, const struct ID *id)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition: report.c:83
#define BLI_assert(a)
Definition: BLI_assert.h:46
File and directory operations.
bool BLI_is_file(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: storage.c:402
#define FILE_MAX
#define UNUSED(x)
#define ELEM(...)
#define TIP_(msgid)
#define ID_FAKE_USERS(id)
Definition: DNA_ID.h:552
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
Definition: DNA_ID.h:581
#define ID_IS_LINKED(_id)
Definition: DNA_ID.h:566
#define ID_IS_OVERRIDE_LIBRARY(_id)
Definition: DNA_ID.h:588
@ IDOVERRIDE_LIBRARY_FLAG_SYSTEM_DEFINED
Definition: DNA_ID.h:327
@ ICON_SIZE_PREVIEW
Definition: DNA_ID_enums.h:16
@ ID_WS
Definition: DNA_ID_enums.h:79
@ ID_NT
Definition: DNA_ID_enums.h:68
@ ID_TXT
Definition: DNA_ID_enums.h:62
@ ID_SCE
Definition: DNA_ID_enums.h:45
@ ID_SCR
Definition: DNA_ID_enums.h:60
@ ID_GR
Definition: DNA_ID_enums.h:65
@ ID_OB
Definition: DNA_ID_enums.h:47
@ FILE_SORT_DEFAULT
@ FILE_SPECIAL
@ FILE_TYPE_FOLDER
@ FILE_TYPE_IMAGE
@ FILE_DEFAULTDISPLAY
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
void ED_assetlist_storage_tag_main_data_dirty(void)
Definition: asset_list.cc:533
void ED_preview_kill_jobs(struct wmWindowManager *wm, struct Main *bmain)
void ED_OT_undo_history(struct wmOperatorType *ot)
Definition: ed_undo.c:779
void ED_OT_undo(struct wmOperatorType *ot)
Definition: ed_undo.c:589
void ED_OT_undo_redo(struct wmOperatorType *ot)
Definition: ed_undo.c:644
void ED_OT_redo(struct wmOperatorType *ot)
Definition: ed_undo.c:632
void ED_OT_undo_push(struct wmOperatorType *ot)
Definition: ed_undo.c:601
bool ED_editors_flush_edits(struct Main *bmain)
Definition: ed_util.c:325
#define C
Definition: RandGen.cpp:25
void UI_context_active_but_prop_get_templateID(struct bContext *C, struct PointerRNA *r_ptr, struct PropertyRNA **r_prop)
void UI_icon_render_id_ex(const struct bContext *C, struct Scene *scene, struct ID *id_to_render, const enum eIconSizes size, const bool use_job, struct PreviewImage *r_preview_image)
void UI_icon_render_id(const struct bContext *C, struct Scene *scene, struct ID *id, enum eIconSizes size, bool use_job)
@ WM_FILESEL_FILEPATH
Definition: WM_api.h:755
@ FILE_OPENFILE
Definition: WM_api.h:764
@ OPTYPE_INTERNAL
Definition: WM_types.h:168
@ OPTYPE_UNDO
Definition: WM_types.h:148
@ OPTYPE_REGISTER
Definition: WM_types.h:146
#define NC_WM
Definition: WM_types.h:324
#define ND_LIB_OVERRIDE_CHANGED
Definition: WM_types.h:367
#define NA_EDITED
Definition: WM_types.h:523
#define NC_ASSET
Definition: WM_types.h:354
static bool lib_id_generate_preview_poll(bContext *C)
Definition: ed_util_ops.cc:112
static int lib_id_generate_preview_from_object_exec(bContext *C, wmOperator *UNUSED(op))
Definition: ed_util_ops.cc:173
static int lib_id_fake_user_toggle_exec(bContext *C, wmOperator *op)
Definition: ed_util_ops.cc:212
void ED_operatortypes_edutils()
Definition: ed_util_ops.cc:372
static int lib_id_override_editable_toggle_exec(bContext *C, wmOperator *UNUSED(op))
Definition: ed_util_ops.cc:307
static void ED_OT_lib_id_generate_preview(wmOperatorType *ot)
Definition: ed_util_ops.cc:148
static void ED_OT_lib_id_unlink(wmOperatorType *ot)
Definition: ed_util_ops.cc:285
static int ed_flush_edits_exec(bContext *C, wmOperator *UNUSED(op))
Definition: ed_util_ops.cc:349
static int lib_id_load_custom_preview_exec(bContext *C, wmOperator *op)
Definition: ed_util_ops.cc:68
static void ED_OT_lib_id_generate_preview_from_object(wmOperatorType *ot)
Definition: ed_util_ops.cc:192
static void ED_OT_flush_edits(wmOperatorType *ot)
Definition: ed_util_ops.cc:356
static int lib_id_generate_preview_exec(bContext *C, wmOperator *UNUSED(op))
Definition: ed_util_ops.cc:128
static bool lib_id_generate_preview_from_object_poll(bContext *C)
Definition: ed_util_ops.cc:162
static void ED_OT_lib_id_override_editable_toggle(wmOperatorType *ot)
Definition: ed_util_ops.cc:328
static bool lib_id_override_editable_toggle_poll(bContext *C)
Definition: ed_util_ops.cc:299
static bool lib_id_preview_editing_poll(bContext *C)
Definition: ed_util_ops.cc:43
static void ED_OT_lib_id_load_custom_preview(wmOperatorType *ot)
Definition: ed_util_ops.cc:89
static void ED_OT_lib_id_fake_user_toggle(wmOperatorType *ot)
Definition: ed_util_ops.cc:247
static int lib_id_unlink_exec(bContext *C, wmOperator *op)
Definition: ed_util_ops.cc:261
#define GS(x)
Definition: iris.c:225
static const pxr::TfToken preview("preview", pxr::TfToken::Immortal)
bool RNA_struct_is_ID(const StructRNA *type)
Definition: rna_access.c:655
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value, ReportList *reports)
Definition: rna_access.c:3532
const PointerRNA PointerRNA_NULL
Definition: rna_access.c:61
PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
Definition: rna_access.c:3493
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
Definition: rna_access.c:2138
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
Definition: rna_access.c:5116
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition: rna_access.c:164
Definition: DNA_ID.h:368
char name[66]
Definition: DNA_ID.h:378
Definition: BKE_main.h:121
struct StructRNA * type
Definition: RNA_types.h:37
void * data
Definition: RNA_types.h:38
struct PropertyRNA * prop
Definition: RNA_types.h:43
PointerRNA ptr
Definition: RNA_types.h:42
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
const char * idname
Definition: WM_types.h:890
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:943
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_main_add_notifier(unsigned int type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition: wm_files.c:3479
void WM_operator_properties_filesel(wmOperatorType *ot, const int filter, const short type, const eFileSel_Action action, const eFileSel_Flag flag, const short display, const short sort)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))
int WM_operator_filesel(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))