Blender V4.3
FX_ui_common.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_listbase.h"
10#include "BLI_string.h"
11
12#include "MEM_guardedalloc.h"
13
14#include "BKE_context.hh"
15#include "BKE_object.hh"
16#include "BKE_screen.hh"
17#include "BKE_shader_fx.h"
18
19#include "DNA_object_types.h"
20#include "DNA_scene_types.h"
21#include "DNA_screen_types.h"
22#include "DNA_shader_fx_types.h"
23
24#include "ED_object.hh"
25
26#include "BLT_translation.hh"
27
28#include "UI_interface.hh"
29#include "UI_resources.hh"
30
31#include "RNA_access.hh"
32#include "RNA_prototypes.hh"
33
34#include "WM_api.hh"
35#include "WM_types.hh"
36
37#include "FX_ui_common.h" /* Self include */
38
39/* -------------------------------------------------------------------- */
46static void shaderfx_reorder(bContext *C, Panel *panel, int new_index)
47{
48 PointerRNA *fx_ptr = UI_panel_custom_data_get(panel);
49 ShaderFxData *fx = (ShaderFxData *)fx_ptr->data;
50
51 PointerRNA props_ptr;
52 wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_shaderfx_move_to_index", false);
54 RNA_string_set(&props_ptr, "shaderfx", fx->name);
55 RNA_int_set(&props_ptr, "index", new_index);
56 WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr, nullptr);
58}
59
63static short get_shaderfx_expand_flag(const bContext * /*C*/, Panel *panel)
64{
65 PointerRNA *fx_ptr = UI_panel_custom_data_get(panel);
66 ShaderFxData *fx = (ShaderFxData *)fx_ptr->data;
67 return fx->ui_expand_flag;
68}
69
73static void set_shaderfx_expand_flag(const bContext * /*C*/, Panel *panel, short expand_flag)
74{
75 PointerRNA *fx_ptr = UI_panel_custom_data_get(panel);
76 ShaderFxData *fx = (ShaderFxData *)fx_ptr->data;
77 fx->ui_expand_flag = expand_flag;
78}
79
82/* -------------------------------------------------------------------- */
87{
88 ShaderFxData *fx = static_cast<ShaderFxData *>(ptr->data);
89 if (fx->error) {
90 uiLayout *row = uiLayoutRow(layout, false);
91 uiItemL(row, RPT_(fx->error), ICON_ERROR);
92 }
93}
94
96{
98 BLI_assert(RNA_struct_is_a(ptr->type, &RNA_ShaderFx));
99
100 if (r_ob_ptr != nullptr) {
101 *r_ob_ptr = RNA_pointer_create(ptr->owner_id, &RNA_Object, ptr->owner_id);
102 }
103
104 UI_panel_context_pointer_set(panel, "shaderfx", ptr);
105
106 return ptr;
107}
108
109#define ERROR_LIBDATA_MESSAGE N_("External library data")
110
111static void gpencil_shaderfx_ops_extra_draw(bContext *C, uiLayout *layout, void *fx_v)
112{
113 PointerRNA op_ptr;
114 uiLayout *row;
115 ShaderFxData *fx = (ShaderFxData *)fx_v;
116
118 PointerRNA ptr = RNA_pointer_create(&ob->id, &RNA_ShaderFx, fx);
119 uiLayoutSetContextPointer(layout, "shaderfx", &ptr);
121
122 uiLayoutSetUnitsX(layout, 4.0f);
123
124 /* Duplicate. */
125 uiItemO(layout,
127 ICON_DUPLICATE,
128 "OBJECT_OT_shaderfx_copy");
129
130 uiItemS(layout);
131
132 /* Move to first. */
133 row = uiLayoutColumn(layout, false);
134 uiItemFullO(row,
135 "OBJECT_OT_shaderfx_move_to_index",
136 IFACE_("Move to First"),
137 ICON_TRIA_UP,
138 nullptr,
141 &op_ptr);
142 RNA_int_set(&op_ptr, "index", 0);
143 if (!fx->prev) {
144 uiLayoutSetEnabled(row, false);
145 }
146
147 /* Move to last. */
148 row = uiLayoutColumn(layout, false);
149 uiItemFullO(row,
150 "OBJECT_OT_shaderfx_move_to_index",
151 IFACE_("Move to Last"),
152 ICON_TRIA_DOWN,
153 nullptr,
156 &op_ptr);
157 RNA_int_set(&op_ptr, "index", BLI_listbase_count(&ob->shader_fx) - 1);
158 if (!fx->next) {
159 uiLayoutSetEnabled(row, false);
160 }
161}
162
163static void shaderfx_panel_header(const bContext * /*C*/, Panel *panel)
164{
165 uiLayout *layout = panel->layout;
166 bool narrow_panel = (panel->sizex < UI_UNIT_X * 7 && panel->sizex != 0);
167
169 Object *ob = (Object *)ptr->owner_id;
171
173
175
176 /* Effect type icon. */
177 uiLayout *row = uiLayoutRow(layout, false);
178 if (fxti->is_disabled && fxti->is_disabled(fx, false)) {
179 uiLayoutSetRedAlert(row, true);
180 }
182
183 /* Effect name. */
184 row = uiLayoutRow(layout, true);
185 if (!narrow_panel) {
186 uiItemR(row, ptr, "name", UI_ITEM_NONE, "", ICON_NONE);
187 }
188
189 /* Mode enabling buttons. */
191 uiLayout *sub = uiLayoutRow(row, true);
192 uiLayoutSetActive(sub, false);
193 uiItemR(sub, ptr, "show_in_editmode", UI_ITEM_NONE, "", ICON_NONE);
194 }
195 uiItemR(row, ptr, "show_viewport", UI_ITEM_NONE, "", ICON_NONE);
196 uiItemR(row, ptr, "show_render", UI_ITEM_NONE, "", ICON_NONE);
197
198 /* Extra operators. */
199 uiItemMenuF(row, "", ICON_DOWNARROW_HLT, gpencil_shaderfx_ops_extra_draw, fx);
200
201 row = uiLayoutRow(row, false);
203 uiItemO(row, "", ICON_X, "OBJECT_OT_shaderfx_remove");
204
205 /* Some padding so the X isn't too close to the drag icon. */
206 uiItemS(layout);
207}
208
211/* -------------------------------------------------------------------- */
215static bool shaderfx_ui_poll(const bContext *C, PanelType * /*pt*/)
216{
218
219 return (ob != nullptr) && ELEM(ob->type, OB_GPENCIL_LEGACY, OB_GREASE_PENCIL);
220}
221
223{
224 PanelType *panel_type = static_cast<PanelType *>(MEM_callocN(sizeof(PanelType), __func__));
225
226 BKE_shaderfxType_panel_id(type, panel_type->idname);
227 STRNCPY(panel_type->label, "");
228 STRNCPY(panel_type->context, "shaderfx");
230
232 panel_type->draw = draw;
233 panel_type->poll = shaderfx_ui_poll;
234
235 /* Give the panel the special flag that says it was built here and corresponds to a
236 * shader effect rather than a PanelType. */
238 panel_type->reorder = shaderfx_reorder;
241
242 BLI_addtail(&region_type->paneltypes, panel_type);
243
244 return panel_type;
245}
246
248 const char *name,
249 const char *label,
250 PanelDrawFn draw_header,
251 PanelDrawFn draw,
252 PanelType *parent)
253{
254 PanelType *panel_type = static_cast<PanelType *>(MEM_callocN(sizeof(PanelType), __func__));
255
256 BLI_assert(parent != nullptr);
257 SNPRINTF(panel_type->idname, "%s_%s", parent->idname, name);
258 STRNCPY(panel_type->label, label);
259 STRNCPY(panel_type->context, "shaderfx");
261
262 panel_type->draw_header = draw_header;
263 panel_type->draw = draw;
264 panel_type->poll = shaderfx_ui_poll;
265 panel_type->flag = PANEL_TYPE_DEFAULT_CLOSED;
266
267 STRNCPY(panel_type->parent_id, parent->idname);
268 panel_type->parent = parent;
269 BLI_addtail(&parent->children, BLI_genericNodeN(panel_type));
270 BLI_addtail(&region_type->paneltypes, panel_type);
271
272 return panel_type;
273}
274
General operations, lookup, etc. for blender objects.
@ PANEL_TYPE_INSTANCED
@ PANEL_TYPE_DEFAULT_CLOSED
@ PANEL_TYPE_HEADER_EXPAND
void BKE_shaderfxType_panel_id(ShaderFxType type, char *r_idname)
Definition shader_fx.cc:147
const ShaderFxTypeInfo * BKE_shaderfx_get_info(ShaderFxType type)
Definition shader_fx.cc:131
@ eShaderFxTypeFlag_SupportsEditmode
#define BLI_assert(a)
Definition BLI_assert.h:50
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
struct LinkData * BLI_genericNodeN(void *data)
Definition listbase.cc:909
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STRNCPY(dst, src)
Definition BLI_string.h:593
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:597
#define ELEM(...)
#define RPT_(msgid)
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
#define IFACE_(msgid)
#define BLT_I18NCONTEXT_DEFAULT_BPYRNA
#define ID_IS_EDITABLE(_id)
Definition DNA_ID.h:658
Object is a sort of wrapper for general info.
@ OB_GREASE_PENCIL
@ OB_GPENCIL_LEGACY
PanelType * shaderfx_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
static bool shaderfx_ui_poll(const bContext *C, PanelType *)
static void shaderfx_panel_header(const bContext *, Panel *panel)
static short get_shaderfx_expand_flag(const bContext *, Panel *panel)
static void set_shaderfx_expand_flag(const bContext *, Panel *panel, short expand_flag)
static void shaderfx_reorder(bContext *C, Panel *panel, int new_index)
PanelType * shaderfx_panel_register(ARegionType *region_type, ShaderFxType type, PanelDrawFn draw)
void shaderfx_panel_end(uiLayout *layout, PointerRNA *ptr)
static void gpencil_shaderfx_ops_extra_draw(bContext *C, uiLayout *layout, void *fx_v)
PointerRNA * shaderfx_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
#define ERROR_LIBDATA_MESSAGE
Read Guarded memory(de)allocation.
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_EMBOSS_NONE
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
void uiItemL(uiLayout *layout, const char *name, int icon)
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, IDProperty *properties, wmOperatorCallContext context, eUI_Item_Flag flag, PointerRNA *r_opptr)
void uiLayoutSetRedAlert(uiLayout *layout, bool redalert)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiItemS(uiLayout *layout)
#define UI_ITEM_NONE
void uiLayoutSetUnitsX(uiLayout *layout, float unit)
void uiLayoutSetEmboss(uiLayout *layout, eUIEmbossType emboss)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg)
#define UI_UNIT_X
PointerRNA * UI_panel_custom_data_get(const Panel *panel)
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
void UI_panel_context_pointer_set(Panel *panel, const char *name, PointerRNA *ptr)
void UI_block_lock_set(uiBlock *block, bool val, const char *lockstr)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
void uiLayoutSetContextPointer(uiLayout *layout, const char *name, PointerRNA *ptr)
@ WM_OP_INVOKE_DEFAULT
Definition WM_types.hh:218
const char * label
void(*)(const bContext *, Panel *) PanelDrawFn
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
Object * context_active_object(const bContext *C)
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
int RNA_struct_ui_icon(const StructRNA *type)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
ListBase paneltypes
ListBase shader_fx
void(* reorder)(bContext *C, Panel *pa, int new_index)
void(* set_list_data_expand_flag)(const bContext *C, Panel *pa, short expand_flag)
void(* draw)(const bContext *C, Panel *panel)
char idname[BKE_ST_MAXNAME]
bool(* poll)(const bContext *C, PanelType *pt)
char context[BKE_ST_MAXNAME]
char translation_context[BKE_ST_MAXNAME]
ListBase children
char label[BKE_ST_MAXNAME]
short(* get_list_data_expand_flag)(const bContext *C, Panel *pa)
char parent_id[BKE_ST_MAXNAME]
PanelType * parent
void(* draw_header)(const bContext *C, Panel *panel)
struct uiLayout * layout
ID * owner_id
Definition RNA_types.hh:40
StructRNA * type
Definition RNA_types.hh:41
void * data
Definition RNA_types.hh:42
struct ShaderFxData * prev
struct ShaderFxData * next
ShaderFxTypeFlag flags
bool(* is_disabled)(struct ShaderFxData *fx, bool use_render_params)
int WM_operator_name_call_ptr(bContext *C, wmOperatorType *ot, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
PointerRNA * ptr
Definition wm_files.cc:4126
wmOperatorType * ot
Definition wm_files.cc:4125
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
void WM_operator_properties_free(PointerRNA *ptr)