Blender  V3.3
MOD_ui_common.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include "BLI_listbase.h"
8 #include "BLI_string.h"
9 
10 #include "MEM_guardedalloc.h"
11 
12 #include "BKE_context.h"
13 #include "BKE_modifier.h"
14 #include "BKE_object.h"
15 #include "BKE_screen.h"
16 
17 #include "DNA_object_force_types.h"
18 #include "DNA_object_types.h"
19 #include "DNA_particle_types.h"
20 #include "DNA_scene_types.h"
21 #include "DNA_screen_types.h"
22 
23 #include "ED_object.h"
24 
25 #include "BLT_translation.h"
26 
27 #include "UI_interface.h"
28 #include "UI_resources.h"
29 
30 #include "RNA_access.h"
31 #include "RNA_prototypes.h"
32 
33 #include "WM_api.h"
34 #include "WM_types.h"
35 
36 #include "MOD_modifiertypes.h"
37 #include "MOD_ui_common.h" /* Self include */
38 
43 static bool modifier_ui_poll(const bContext *C, PanelType *UNUSED(pt))
44 {
46 
47  return (ob != NULL) && (ob->type != OB_GPENCIL);
48 }
49 
50 /* -------------------------------------------------------------------- */
57 static void modifier_reorder(bContext *C, Panel *panel, int new_index)
58 {
59  PointerRNA *md_ptr = UI_panel_custom_data_get(panel);
60  ModifierData *md = (ModifierData *)md_ptr->data;
61 
62  PointerRNA props_ptr;
63  wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_modifier_move_to_index", false);
65  RNA_string_set(&props_ptr, "modifier", md->name);
66  RNA_int_set(&props_ptr, "index", new_index);
68  WM_operator_properties_free(&props_ptr);
69 }
70 
71 static short get_modifier_expand_flag(const bContext *UNUSED(C), Panel *panel)
72 {
73  PointerRNA *md_ptr = UI_panel_custom_data_get(panel);
74  ModifierData *md = (ModifierData *)md_ptr->data;
75  return md->ui_expand_flag;
76 }
77 
78 static void set_modifier_expand_flag(const bContext *UNUSED(C), Panel *panel, short expand_flag)
79 {
80  PointerRNA *md_ptr = UI_panel_custom_data_get(panel);
81  ModifierData *md = (ModifierData *)md_ptr->data;
82  md->ui_expand_flag = expand_flag;
83 }
84 
87 /* -------------------------------------------------------------------- */
92 {
93  ModifierData *md = ptr->data;
94  if (md->error) {
95  uiLayout *row = uiLayoutRow(layout, false);
96  uiItemL(row, TIP_(md->error), ICON_ERROR);
97  }
98 }
99 
106 #define ERROR_LIBDATA_MESSAGE TIP_("External library data")
108 {
111  BLI_assert(RNA_struct_is_a(ptr->type, &RNA_Modifier));
112 
113  if (r_ob_ptr != NULL) {
114  RNA_pointer_create(ptr->owner_id, &RNA_Object, ptr->owner_id, r_ob_ptr);
115  }
116 
117  uiBlock *block = uiLayoutGetBlock(panel->layout);
119 
120  UI_panel_context_pointer_set(panel, "modifier", ptr);
121 
122  return ptr;
123 }
124 
126  PointerRNA *ptr,
127  PointerRNA *ob_ptr,
128  const char *vgroup_prop,
129  const char *invert_vgroup_prop,
130  const char *text)
131 {
132  bool has_vertex_group = RNA_string_length(ptr, vgroup_prop) != 0;
133 
134  uiLayout *row = uiLayoutRow(layout, true);
135  uiItemPointerR(row, ptr, vgroup_prop, ob_ptr, "vertex_groups", text, ICON_NONE);
136  if (invert_vgroup_prop != NULL) {
137  uiLayout *sub = uiLayoutRow(row, true);
138  uiLayoutSetActive(sub, has_vertex_group);
139  uiLayoutSetPropDecorate(sub, false);
140  uiItemR(sub, ptr, invert_vgroup_prop, 0, "", ICON_ARROW_LEFTRIGHT);
141  }
142 }
143 
149 {
150  /* Physic Tab */
151  if (ELEM(md->type,
159  return 1;
160  }
161  /* Particle Tab */
162  if (md->type == eModifierType_ParticleSystem) {
163  return 2;
164  }
165 
166  return 0;
167 }
168 
170 {
171  /* fluid particle modifier can't be deleted here */
172  if (md->type == eModifierType_ParticleSystem) {
173  short particle_type = ((ParticleSystemModifierData *)md)->psys->part->type;
174  if (ELEM(particle_type,
175  PART_FLUID,
185  return false;
186  }
187  }
188  return true;
189 }
190 
191 static void modifier_ops_extra_draw(bContext *C, uiLayout *layout, void *md_v)
192 {
193  PointerRNA op_ptr;
194  uiLayout *row;
195  ModifierData *md = (ModifierData *)md_v;
196 
197  PointerRNA ptr;
199  RNA_pointer_create(&ob->id, &RNA_Modifier, md, &ptr);
200  uiLayoutSetContextPointer(layout, "modifier", &ptr);
202 
203  uiLayoutSetUnitsX(layout, 4.0f);
204 
206 
207  /* Apply. */
208  uiItemO(layout,
210  ICON_CHECKMARK,
211  "OBJECT_OT_modifier_apply");
212 
213  /* Apply as shapekey. */
215  uiItemBooleanO(layout,
216  CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply as Shape Key"),
217  ICON_SHAPEKEY_DATA,
218  "OBJECT_OT_modifier_apply_as_shapekey",
219  "keep_modifier",
220  false);
221 
222  uiItemBooleanO(layout,
223  CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Save as Shape Key"),
224  ICON_SHAPEKEY_DATA,
225  "OBJECT_OT_modifier_apply_as_shapekey",
226  "keep_modifier",
227  true);
228  }
229 
230  /* Duplicate. */
231  if (!ELEM(md->type,
237  uiItemO(layout,
239  ICON_DUPLICATE,
240  "OBJECT_OT_modifier_copy");
241  }
242 
243  uiItemO(layout,
244  CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Copy to Selected"),
245  0,
246  "OBJECT_OT_modifier_copy_to_selected");
247 
248  uiItemS(layout);
249 
250  /* Move to first. */
251  row = uiLayoutColumn(layout, false);
252  uiItemFullO(row,
253  "OBJECT_OT_modifier_move_to_index",
254  IFACE_("Move to First"),
255  ICON_TRIA_UP,
256  NULL,
258  0,
259  &op_ptr);
260  RNA_int_set(&op_ptr, "index", 0);
261  if (!md->prev) {
262  uiLayoutSetEnabled(row, false);
263  }
264 
265  /* Move to last. */
266  row = uiLayoutColumn(layout, false);
267  uiItemFullO(row,
268  "OBJECT_OT_modifier_move_to_index",
269  IFACE_("Move to Last"),
270  ICON_TRIA_DOWN,
271  NULL,
273  0,
274  &op_ptr);
275  RNA_int_set(&op_ptr, "index", BLI_listbase_count(&ob->modifiers) - 1);
276  if (!md->next) {
277  uiLayoutSetEnabled(row, false);
278  }
279 }
280 
281 static void modifier_panel_header(const bContext *C, Panel *panel)
282 {
283  uiLayout *row, *sub, *name_row;
284  uiLayout *layout = panel->layout;
285 
286  /* Don't use #modifier_panel_get_property_pointers, we don't want to lock the header. */
288  ModifierData *md = (ModifierData *)ptr->data;
289  Object *ob = (Object *)ptr->owner_id;
290 
291  UI_panel_context_pointer_set(panel, "modifier", ptr);
292 
293  const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
295  int index = BLI_findindex(&ob->modifiers, md);
296 
297  /* Modifier Icon. */
298  sub = uiLayoutRow(layout, true);
300  if (mti->isDisabled && mti->isDisabled(scene, md, 0)) {
301  uiLayoutSetRedAlert(sub, true);
302  }
303  uiItemStringO(sub,
304  "",
306  "OBJECT_OT_modifier_set_active",
307  "modifier",
308  md->name);
309 
310  row = uiLayoutRow(layout, true);
311 
312  /* Modifier Name.
313  * Count how many buttons are added to the header to check if there is enough space. */
314  int buttons_number = 0;
315  name_row = uiLayoutRow(row, true);
316 
317  /* Display mode switching buttons. */
318  if (ob->type == OB_MESH) {
319  int last_cage_index;
320  int cage_index = BKE_modifiers_get_cage_index(scene, ob, &last_cage_index, 0);
321  if (BKE_modifier_supports_cage(scene, md) && (index <= last_cage_index)) {
322  sub = uiLayoutRow(row, true);
323  if (index < cage_index || !BKE_modifier_couldbe_cage(scene, md)) {
324  uiLayoutSetActive(sub, false);
325  }
326  uiItemR(sub, ptr, "show_on_cage", 0, "", ICON_NONE);
327  buttons_number++;
328  }
329  } /* Tessellation point for curve-typed objects. */
330  else if (ELEM(ob->type, OB_CURVES_LEGACY, OB_SURF, OB_FONT)) {
331  /* Some modifiers can work with pre-tessellated curves only. */
333  /* Add button (appearing to be ON) and add tip why this can't be changed. */
334  sub = uiLayoutRow(row, true);
335  uiBlock *block = uiLayoutGetBlock(sub);
336  static int apply_on_spline_always_on_hack = eModifierMode_ApplyOnSpline;
337  uiBut *but = uiDefIconButBitI(block,
340  0,
341  ICON_SURFACE_DATA,
342  0,
343  0,
344  UI_UNIT_X - 2,
345  UI_UNIT_Y,
346  &apply_on_spline_always_on_hack,
347  0.0,
348  0.0,
349  0.0,
350  0.0,
351  TIP_("Apply on Spline"));
353  but, TIP_("This modifier can only deform control points, not the filled curve/surface"));
354  buttons_number++;
355  }
356  else if (mti->type != eModifierTypeType_Constructive) {
357  /* Constructive modifiers tessellates curve before applying. */
358  uiItemR(row, ptr, "use_apply_on_spline", 0, "", ICON_NONE);
359  buttons_number++;
360  }
361  }
362  /* Collision and Surface are always enabled, hide buttons. */
365  sub = uiLayoutRow(row, true);
367  uiItemR(sub, ptr, "show_in_editmode", 0, "", ICON_NONE);
368  buttons_number++;
369  }
370  uiItemR(row, ptr, "show_viewport", 0, "", ICON_NONE);
371  uiItemR(row, ptr, "show_render", 0, "", ICON_NONE);
372  buttons_number += 2;
373  }
374 
375  /* Extra operators menu. */
376  uiItemMenuF(row, "", ICON_DOWNARROW_HLT, modifier_ops_extra_draw, md);
377 
378  /* Delete button. */
380  sub = uiLayoutRow(row, false);
382  uiItemO(sub, "", ICON_X, "OBJECT_OT_modifier_remove");
383  buttons_number++;
384  }
385 
386  /* Switch context buttons. */
387  if (modifier_is_simulation(md) == 1) {
389  row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PHYSICS");
390  buttons_number++;
391  }
392  else if (modifier_is_simulation(md) == 2) {
394  row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PARTICLES");
395  buttons_number++;
396  }
397 
398  bool display_name = (panel->sizex / UI_UNIT_X - buttons_number > 5) || (panel->sizex == 0);
399  if (display_name) {
400  uiItemR(name_row, ptr, "name", 0, "", ICON_NONE);
401  }
402  else {
404  }
405 
406  /* Extra padding for delete button. */
407  uiItemS(layout);
408 }
409 
412 /* -------------------------------------------------------------------- */
417 {
418  PanelType *panel_type = MEM_callocN(sizeof(PanelType), __func__);
419 
420  BKE_modifier_type_panel_id(type, panel_type->idname);
421  BLI_strncpy(panel_type->label, "", BKE_ST_MAXNAME);
422  BLI_strncpy(panel_type->context, "modifier", BKE_ST_MAXNAME);
424  BLI_strncpy(panel_type->active_property, "is_active", BKE_ST_MAXNAME);
425 
426  panel_type->draw_header = modifier_panel_header;
427  panel_type->draw = draw;
428  panel_type->poll = modifier_ui_poll;
429 
430  /* Give the panel the special flag that says it was built here and corresponds to a
431  * modifier rather than a #PanelType. */
433  panel_type->reorder = modifier_reorder;
436 
437  BLI_addtail(&region_type->paneltypes, panel_type);
438 
439  return panel_type;
440 }
441 
443  const char *name,
444  const char *label,
445  PanelDrawFn draw_header,
446  PanelDrawFn draw,
447  PanelType *parent)
448 {
449  PanelType *panel_type = MEM_callocN(sizeof(PanelType), __func__);
450 
451  BLI_snprintf(panel_type->idname, BKE_ST_MAXNAME, "%s_%s", parent->idname, name);
452  BLI_strncpy(panel_type->label, label, BKE_ST_MAXNAME);
453  BLI_strncpy(panel_type->context, "modifier", BKE_ST_MAXNAME);
455  BLI_strncpy(panel_type->active_property, "is_active", BKE_ST_MAXNAME);
456 
457  panel_type->draw_header = draw_header;
458  panel_type->draw = draw;
459  panel_type->poll = modifier_ui_poll;
460  panel_type->flag = PANEL_TYPE_DEFAULT_CLOSED;
461 
462  BLI_assert(parent != NULL);
463  BLI_strncpy(panel_type->parent_id, parent->idname, BKE_ST_MAXNAME);
464  panel_type->parent = parent;
465  BLI_addtail(&parent->children, BLI_genericNodeN(panel_type));
466  BLI_addtail(&region_type->paneltypes, panel_type);
467 
468  return panel_type;
469 }
470 
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
bool BKE_modifier_is_non_geometrical(ModifierData *md)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:69
bool BKE_modifier_couldbe_cage(struct Scene *scene, struct ModifierData *md)
bool BKE_modifier_is_same_topology(ModifierData *md)
bool BKE_modifier_supports_cage(struct Scene *scene, struct ModifierData *md)
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:47
void BKE_modifier_type_panel_id(ModifierType type, char *r_idname)
int BKE_modifiers_get_cage_index(const struct Scene *scene, struct Object *ob, int *r_lastPossibleCageIndex, bool is_virtual)
General operations, lookup, etc. for blender objects.
@ PANEL_TYPE_INSTANCED
Definition: BKE_screen.h:285
@ PANEL_TYPE_DEFAULT_CLOSED
Definition: BKE_screen.h:279
@ PANEL_TYPE_HEADER_EXPAND
Definition: BKE_screen.h:282
#define BKE_ST_MAXNAME
Definition: BKE_screen.h:53
#define BLI_assert(a)
Definition: BLI_assert.h:46
struct LinkData * BLI_genericNodeN(void *data)
Definition: listbase.c:842
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:80
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define UNUSED(x)
#define ELEM(...)
#define TIP_(msgid)
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
#define IFACE_(msgid)
#define BLT_I18NCONTEXT_DEFAULT_BPYRNA
#define ID_IS_LINKED(_id)
Definition: DNA_ID.h:566
@ eModifierMode_ApplyOnSpline
@ eModifierMode_Realtime
ModifierType
@ eModifierType_ParticleSystem
@ eModifierType_MeshDeform
@ eModifierType_Fluidsim
@ eModifierType_Surface
@ eModifierType_Cloth
@ eModifierType_Fluid
@ eModifierType_Hook
@ eModifierType_Collision
@ eModifierType_DynamicPaint
@ eModifierType_Softbody
Object is a sort of wrapper for general info.
@ OB_SURF
@ OB_FONT
@ OB_MESH
@ OB_CURVES_LEGACY
@ OB_GPENCIL
@ PART_FLUID_FLIP
@ PART_FLUID_BUBBLE
@ PART_FLUID_SPRAYBUBBLE
@ PART_FLUID_TRACER
@ PART_FLUID
@ PART_FLUID_FOAM
@ PART_FLUID_SPRAYFOAMBUBBLE
@ PART_FLUID_SPRAYFOAM
@ PART_FLUID_SPRAY
@ PART_FLUID_FOAMBUBBLE
struct Object * ED_object_active_context(const struct bContext *C)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
static short get_modifier_expand_flag(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_ui_common.c:71
static void modifier_reorder(bContext *C, Panel *panel, int new_index)
Definition: MOD_ui_common.c:57
static void modifier_panel_header(const bContext *C, Panel *panel)
static int modifier_is_simulation(const ModifierData *md)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
static bool modifier_ui_poll(const bContext *C, PanelType *UNUSED(pt))
Definition: MOD_ui_common.c:43
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
Definition: MOD_ui_common.c:91
static bool modifier_can_delete(ModifierData *md)
static void set_modifier_expand_flag(const bContext *UNUSED(C), Panel *panel, short expand_flag)
Definition: MOD_ui_common.c:78
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
#define ERROR_LIBDATA_MESSAGE
static void modifier_ops_extra_draw(bContext *C, uiLayout *layout, void *md_v)
#define C
Definition: RandGen.cpp:25
void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
@ UI_LAYOUT_ALIGN_RIGHT
void UI_but_disable(uiBut *but, const char *disabled_hint)
Definition: interface.cc:5883
#define UI_UNIT_Y
void uiLayoutSetActive(uiLayout *layout, bool active)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
@ UI_EMBOSS_NONE
Definition: UI_interface.h:109
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
void UI_panel_context_pointer_set(struct Panel *panel, const char *name, struct PointerRNA *ptr)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemL(uiLayout *layout, const char *name, int icon)
void uiLayoutSetRedAlert(uiLayout *layout, bool redalert)
struct PointerRNA * UI_panel_custom_data_get(const struct Panel *panel)
void uiLayoutSetAlignment(uiLayout *layout, char alignment)
void uiItemS(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetUnitsX(uiLayout *layout, float unit)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiLayoutSetEmboss(uiLayout *layout, eUIEmbossType emboss)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, struct IDProperty *properties, wmOperatorCallContext context, int flag, struct PointerRNA *r_opptr)
void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value)
void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg)
#define UI_UNIT_X
void UI_block_flag_enable(uiBlock *block, int flag)
Definition: interface.cc:5848
uiBut * uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, int x, int y, short width, short height, int *poin, float min, float max, float a1, float a2, const char *tip)
Definition: interface.cc:5422
@ UI_BTYPE_TOGGLE
Definition: UI_interface.h:340
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
void UI_block_lock_set(uiBlock *block, bool val, const char *lockstr)
Definition: interface.cc:2273
@ UI_BLOCK_IS_FLIP
Definition: UI_interface.h:136
@ WM_OP_INVOKE_DEFAULT
Definition: WM_types.h:201
const char * label
Scene scene
void(* PanelDrawFn)(const bContext *, struct Panel *)
Definition: fmodifier_ui.c:46
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
Definition: rna_access.c:695
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
Definition: rna_access.c:136
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:5155
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:4921
int RNA_struct_ui_icon(const StructRNA *type)
Definition: rna_access.c:601
int RNA_string_length(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5144
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition: rna_access.c:164
ListBase paneltypes
Definition: BKE_screen.h:198
struct ModifierData * next
struct ModifierData * prev
bool(* isDisabled)(const struct Scene *scene, struct ModifierData *md, bool userRenderParams)
Definition: BKE_modifier.h:291
ModifierTypeFlag flags
Definition: BKE_modifier.h:161
ModifierTypeType type
Definition: BKE_modifier.h:160
ListBase modifiers
short(* get_list_data_expand_flag)(const struct bContext *C, struct Panel *pa)
Definition: BKE_screen.h:260
void(* draw)(const struct bContext *C, struct Panel *panel)
Definition: BKE_screen.h:248
bool(* poll)(const struct bContext *C, struct PanelType *pt)
Definition: BKE_screen.h:242
void(* draw_header)(const struct bContext *C, struct Panel *panel)
Definition: BKE_screen.h:244
char idname[BKE_ST_MAXNAME]
Definition: BKE_screen.h:223
void(* set_list_data_expand_flag)(const struct bContext *C, struct Panel *pa, short expand_flag)
Definition: BKE_screen.h:267
char context[BKE_ST_MAXNAME]
Definition: BKE_screen.h:227
void(* reorder)(struct bContext *C, struct Panel *pa, int new_index)
Definition: BKE_screen.h:253
char translation_context[BKE_ST_MAXNAME]
Definition: BKE_screen.h:226
char active_property[BKE_ST_MAXNAME]
Definition: BKE_screen.h:232
ListBase children
Definition: BKE_screen.h:271
struct PanelType * parent
Definition: BKE_screen.h:270
char label[BKE_ST_MAXNAME]
Definition: BKE_screen.h:224
char parent_id[BKE_ST_MAXNAME]
Definition: BKE_screen.h:230
struct uiLayout * layout
struct StructRNA * type
Definition: RNA_types.h:37
void * data
Definition: RNA_types.h:38
struct ID * owner_id
Definition: RNA_types.h:36
int WM_operator_name_call_ptr(bContext *C, wmOperatorType *ot, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
PointerRNA * ptr
Definition: wm_files.c:3480
wmOperatorType * ot
Definition: wm_files.c:3479
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
Definition: wm_operators.c:661
void WM_operator_properties_free(PointerRNA *ptr)
Definition: wm_operators.c:783