Blender V4.5
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
8
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_library.hh"
16#include "BKE_screen.hh"
17#include "BKE_shader_fx.h"
18
19#include "DNA_object_types.h"
20#include "DNA_screen_types.h"
21#include "DNA_shader_fx_types.h"
22
23#include "ED_object.hh"
24
25#include "BLT_translation.hh"
26
27#include "UI_interface.hh"
28#include "UI_resources.hh"
29
30#include "RNA_access.hh"
31#include "RNA_prototypes.hh"
32
33#include "WM_api.hh"
34#include "WM_types.hh"
35
36#include "FX_ui_common.h" /* Self include */
37
38/* -------------------------------------------------------------------- */
41
45static void shaderfx_reorder(bContext *C, Panel *panel, int new_index)
46{
47 PointerRNA *fx_ptr = UI_panel_custom_data_get(panel);
48 ShaderFxData *fx = (ShaderFxData *)fx_ptr->data;
49
50 PointerRNA props_ptr;
51 wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_shaderfx_move_to_index", false);
53 RNA_string_set(&props_ptr, "shaderfx", fx->name);
54 RNA_int_set(&props_ptr, "index", new_index);
55 WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr, nullptr);
57}
58
62static short get_shaderfx_expand_flag(const bContext * /*C*/, Panel *panel)
63{
64 PointerRNA *fx_ptr = UI_panel_custom_data_get(panel);
65 ShaderFxData *fx = (ShaderFxData *)fx_ptr->data;
66 return fx->ui_expand_flag;
67}
68
72static void set_shaderfx_expand_flag(const bContext * /*C*/, Panel *panel, short expand_flag)
73{
74 PointerRNA *fx_ptr = UI_panel_custom_data_get(panel);
75 ShaderFxData *fx = (ShaderFxData *)fx_ptr->data;
76 fx->ui_expand_flag = expand_flag;
77}
78
80
81/* -------------------------------------------------------------------- */
84
86{
87 ShaderFxData *fx = static_cast<ShaderFxData *>(ptr->data);
88 if (fx->error) {
89 uiLayout *row = &layout->row(false);
90 row->label(RPT_(fx->error), ICON_ERROR);
91 }
92}
93
95{
97 BLI_assert(RNA_struct_is_a(ptr->type, &RNA_ShaderFx));
98
99 if (r_ob_ptr != nullptr) {
100 *r_ob_ptr = RNA_pointer_create_discrete(ptr->owner_id, &RNA_Object, ptr->owner_id);
101 }
102
103 UI_panel_context_pointer_set(panel, "shaderfx", ptr);
104
105 return ptr;
106}
107
108#define ERROR_LIBDATA_MESSAGE N_("External library data")
109
110static void gpencil_shaderfx_ops_extra_draw(bContext *C, uiLayout *layout, void *fx_v)
111{
112 PointerRNA op_ptr;
113 uiLayout *row;
114 ShaderFxData *fx = (ShaderFxData *)fx_v;
115
117 PointerRNA ptr = RNA_pointer_create_discrete(&ob->id, &RNA_ShaderFx, fx);
118 uiLayoutSetContextPointer(layout, "shaderfx", &ptr);
120
121 uiLayoutSetUnitsX(layout, 4.0f);
122
123 /* Duplicate. */
124 layout->op("OBJECT_OT_shaderfx_copy",
126 ICON_DUPLICATE);
127
128 layout->separator();
129
130 /* Move to first. */
131 row = &layout->column(false);
132 op_ptr = row->op("OBJECT_OT_shaderfx_move_to_index",
133 IFACE_("Move to First"),
134 ICON_TRIA_UP,
137 RNA_int_set(&op_ptr, "index", 0);
138 if (!fx->prev) {
139 uiLayoutSetEnabled(row, false);
140 }
141
142 /* Move to last. */
143 row = &layout->column(false);
144 op_ptr = row->op("OBJECT_OT_shaderfx_move_to_index",
145 IFACE_("Move to Last"),
146 ICON_TRIA_DOWN,
149 RNA_int_set(&op_ptr, "index", BLI_listbase_count(&ob->shader_fx) - 1);
150 if (!fx->next) {
151 uiLayoutSetEnabled(row, false);
152 }
153}
154
155static void shaderfx_panel_header(const bContext * /*C*/, Panel *panel)
156{
157 uiLayout *layout = panel->layout;
158 bool narrow_panel = (panel->sizex < UI_UNIT_X * 7 && panel->sizex != 0);
159
161 Object *ob = (Object *)ptr->owner_id;
162 ShaderFxData *fx = (ShaderFxData *)ptr->data;
163
165
167
168 /* Effect type icon. */
169 uiLayout *row = &layout->row(false);
170 if (fxti->is_disabled && fxti->is_disabled(fx, false)) {
171 uiLayoutSetRedAlert(row, true);
172 }
173 row->label("", RNA_struct_ui_icon(ptr->type));
174
175 /* Effect name. */
176 row = &layout->row(true);
177 if (!narrow_panel) {
178 row->prop(ptr, "name", UI_ITEM_NONE, "", ICON_NONE);
179 }
180
181 /* Mode enabling buttons. */
183 uiLayout *sub = &row->row(true);
184 uiLayoutSetActive(sub, false);
185 sub->prop(ptr, "show_in_editmode", UI_ITEM_NONE, "", ICON_NONE);
186 }
187 row->prop(ptr, "show_viewport", UI_ITEM_NONE, "", ICON_NONE);
188 row->prop(ptr, "show_render", UI_ITEM_NONE, "", ICON_NONE);
189
190 /* Extra operators. */
191 row->menu_fn("", ICON_DOWNARROW_HLT, gpencil_shaderfx_ops_extra_draw, fx);
192
193 row = &row->row(false);
195 row->op("OBJECT_OT_shaderfx_remove", "", ICON_X);
196
197 /* Some padding so the X isn't too close to the drag icon. */
198 layout->separator();
199}
200
202
203/* -------------------------------------------------------------------- */
206
207static bool shaderfx_ui_poll(const bContext *C, PanelType * /*pt*/)
208{
210
211 return (ob != nullptr) && ob->type == OB_GREASE_PENCIL;
212}
213
215{
216 PanelType *panel_type = MEM_callocN<PanelType>(__func__);
217
218 BKE_shaderfxType_panel_id(type, panel_type->idname);
219 STRNCPY(panel_type->label, "");
220 STRNCPY(panel_type->context, "shaderfx");
222
224 panel_type->draw = draw;
225 panel_type->poll = shaderfx_ui_poll;
226
227 /* Give the panel the special flag that says it was built here and corresponds to a
228 * shader effect rather than a PanelType. */
230 panel_type->reorder = shaderfx_reorder;
233
234 BLI_addtail(&region_type->paneltypes, panel_type);
235
236 return panel_type;
237}
238
240 const char *name,
241 const char *label,
242 PanelDrawFn draw_header,
243 PanelDrawFn draw,
244 PanelType *parent)
245{
246 PanelType *panel_type = MEM_callocN<PanelType>(__func__);
247
248 BLI_assert(parent != nullptr);
249 SNPRINTF(panel_type->idname, "%s_%s", parent->idname, name);
250 STRNCPY(panel_type->label, label);
251 STRNCPY(panel_type->context, "shaderfx");
253
254 panel_type->draw_header = draw_header;
255 panel_type->draw = draw;
256 panel_type->poll = shaderfx_ui_poll;
257 panel_type->flag = PANEL_TYPE_DEFAULT_CLOSED;
258
259 STRNCPY(panel_type->parent_id, parent->idname);
260 panel_type->parent = parent;
261 BLI_addtail(&parent->children, BLI_genericNodeN(panel_type));
262 BLI_addtail(&region_type->paneltypes, panel_type);
263
264 return panel_type;
265}
266
@ 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:46
LinkData * BLI_genericNodeN(void *data)
Definition listbase.cc:922
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:524
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:599
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:688
#define RPT_(msgid)
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
#define IFACE_(msgid)
#define BLT_I18NCONTEXT_DEFAULT_BPYRNA
Object is a sort of wrapper for general info.
@ OB_GREASE_PENCIL
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)
Read Guarded memory(de)allocation.
#define C
Definition RandGen.cpp:29
#define UI_UNIT_X
PointerRNA * UI_panel_custom_data_get(const Panel *panel)
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 uiLayoutSetContextPointer(uiLayout *layout, blender::StringRef name, PointerRNA *ptr)
void uiLayoutSetActive(uiLayout *layout, bool active)
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
void uiLayoutSetRedAlert(uiLayout *layout, bool redalert)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
#define UI_ITEM_NONE
void uiLayoutSetUnitsX(uiLayout *layout, float unit)
void uiLayoutSetEmboss(uiLayout *layout, blender::ui::EmbossType emboss)
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
@ WM_OP_INVOKE_DEFAULT
Definition WM_types.hh:238
void(*)(const bContext *, Panel *) PanelDrawFn
#define ID_IS_EDITABLE(_id)
#define ERROR_LIBDATA_MESSAGE
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
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_discrete(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
void * data
Definition RNA_types.hh:53
struct ShaderFxData * prev
struct ShaderFxData * next
ShaderFxTypeFlag flags
bool(* is_disabled)(struct ShaderFxData *fx, bool use_render_params)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, wmOperatorCallContext context, eUI_Item_Flag flag)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
void menu_fn(blender::StringRefNull name, int icon, uiMenuCreateFunc func, void *arg)
uiLayout & row(bool align)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
wmOperatorStatus WM_operator_name_call_ptr(bContext *C, wmOperatorType *ot, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
PointerRNA * ptr
Definition wm_files.cc:4227
wmOperatorType * ot
Definition wm_files.cc:4226
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)