Blender V5.0
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_utf8.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"
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/* -------------------------------------------------------------------- */
42
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);
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
81
82/* -------------------------------------------------------------------- */
85
87{
88 ShaderFxData *fx = static_cast<ShaderFxData *>(ptr->data);
89 if (fx->error) {
90 uiLayout *row = &layout->row(false);
91 row->label(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_discrete(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_discrete(&ob->id, &RNA_ShaderFx, fx);
119 layout->context_ptr_set("shaderfx", &ptr);
121
122 layout->ui_units_x_set(4.0f);
123
124 /* Duplicate. */
125 layout->op("OBJECT_OT_shaderfx_copy",
127 ICON_DUPLICATE);
128
129 layout->separator();
130
131 /* Move to first. */
132 row = &layout->column(false);
133 op_ptr = row->op("OBJECT_OT_shaderfx_move_to_index",
134 IFACE_("Move to First"),
135 ICON_TRIA_UP,
138 RNA_int_set(&op_ptr, "index", 0);
139 if (!fx->prev) {
140 row->enabled_set(false);
141 }
142
143 /* Move to last. */
144 row = &layout->column(false);
145 op_ptr = row->op("OBJECT_OT_shaderfx_move_to_index",
146 IFACE_("Move to Last"),
147 ICON_TRIA_DOWN,
150 RNA_int_set(&op_ptr, "index", BLI_listbase_count(&ob->shader_fx) - 1);
151 if (!fx->next) {
152 row->enabled_set(false);
153 }
154}
155
156static void shaderfx_panel_header(const bContext * /*C*/, Panel *panel)
157{
158 uiLayout *layout = panel->layout;
159 bool narrow_panel = (panel->sizex < UI_UNIT_X * 7 && panel->sizex != 0);
160
162 Object *ob = (Object *)ptr->owner_id;
163 ShaderFxData *fx = (ShaderFxData *)ptr->data;
164
166
168
169 /* Effect type icon. */
170 uiLayout *row = &layout->row(false);
171 if (fxti->is_disabled && fxti->is_disabled(fx, false)) {
172 row->red_alert_set(true);
173 }
174 row->label("", RNA_struct_ui_icon(ptr->type));
175
176 /* Effect name. */
177 row = &layout->row(true);
178 if (!narrow_panel) {
179 row->prop(ptr, "name", UI_ITEM_NONE, "", ICON_NONE);
180 }
181
182 /* Mode enabling buttons. */
184 uiLayout *sub = &row->row(true);
185 sub->active_set(false);
186 sub->prop(ptr, "show_in_editmode", UI_ITEM_NONE, "", ICON_NONE);
187 }
188 row->prop(ptr, "show_viewport", UI_ITEM_NONE, "", ICON_NONE);
189 row->prop(ptr, "show_render", UI_ITEM_NONE, "", ICON_NONE);
190
191 /* Extra operators. */
192 row->menu_fn("", ICON_DOWNARROW_HLT, gpencil_shaderfx_ops_extra_draw, fx);
193
194 row = &row->row(false);
196 row->op("OBJECT_OT_shaderfx_remove", "", ICON_X);
197
198 /* Some padding so the X isn't too close to the drag icon. */
199 layout->separator();
200}
201
203
204/* -------------------------------------------------------------------- */
207
208static bool shaderfx_ui_poll(const bContext *C, PanelType * /*pt*/)
209{
211
212 return (ob != nullptr) && ob->type == OB_GREASE_PENCIL;
213}
214
216{
217 PanelType *panel_type = MEM_callocN<PanelType>(__func__);
218
219 BKE_shaderfxType_panel_id(type, panel_type->idname);
220 STRNCPY_UTF8(panel_type->label, "");
221 STRNCPY_UTF8(panel_type->context, "shaderfx");
223
225 panel_type->draw = draw;
226 panel_type->poll = shaderfx_ui_poll;
227
228 /* Give the panel the special flag that says it was built here and corresponds to a
229 * shader effect rather than a PanelType. */
231 panel_type->reorder = shaderfx_reorder;
234
235 BLI_addtail(&region_type->paneltypes, panel_type);
236
237 return panel_type;
238}
239
241 const char *name,
242 const char *label,
243 PanelDrawFn draw_header,
244 PanelDrawFn draw,
245 PanelType *parent)
246{
247 PanelType *panel_type = MEM_callocN<PanelType>(__func__);
248
249 BLI_assert(parent != nullptr);
250 SNPRINTF_UTF8(panel_type->idname, "%s_%s", parent->idname, name);
251 STRNCPY_UTF8(panel_type->label, label);
252 STRNCPY_UTF8(panel_type->context, "shaderfx");
254
255 panel_type->draw_header = draw_header;
256 panel_type->draw = draw;
257 panel_type->poll = shaderfx_ui_poll;
258 panel_type->flag = PANEL_TYPE_DEFAULT_CLOSED;
259
260 STRNCPY_UTF8(panel_type->parent_id, parent->idname);
261 panel_type->parent = parent;
262 BLI_addtail(&parent->children, BLI_genericNodeN(panel_type));
263 BLI_addtail(&region_type->paneltypes, panel_type);
264
265 return panel_type;
266}
267
@ 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_UTF8(dst, format,...)
#define STRNCPY_UTF8(dst, src)
#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:705
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)
#define UI_ITEM_NONE
void(*)(const bContext *, Panel *) PanelDrawFn
#define ERROR_LIBDATA_MESSAGE
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
Object * context_active_object(const bContext *C)
const char * name
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)
uiBlock * block() const
void operator_context_set(blender::wm::OpCallContext opcontext)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void red_alert_set(bool red_alert)
void active_set(bool active)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
void enabled_set(bool enabled)
void menu_fn(blender::StringRefNull name, int icon, uiMenuCreateFunc func, void *arg)
void context_ptr_set(blender::StringRef name, const PointerRNA *ptr)
void ui_units_x_set(float width)
uiLayout & row(bool align)
void emboss_set(blender::ui::EmbossType emboss)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
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, blender::wm::OpCallContext context, PointerRNA *properties, const wmEvent *event)
PointerRNA * ptr
Definition wm_files.cc:4238
wmOperatorType * ot
Definition wm_files.cc:4237
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)