Blender V5.0
interface_template_strip_modifiers.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include "DNA_scene_types.h"
12#include "DNA_sequence_types.h"
13
14#include "BKE_context.hh"
15#include "BKE_screen.hh"
16
17#include "BLI_listbase.h"
18
19#include "SEQ_modifier.hh"
20#include "SEQ_select.hh"
21
22#include "RNA_access.hh"
23#include "RNA_prototypes.hh"
24
25#include "UI_interface.hh"
27
28static void strip_modifier_panel_id(void *smd_link, char *r_name)
29{
30 StripModifierData *smd = reinterpret_cast<StripModifierData *>(smd_link);
32}
33
35{
36 using namespace blender;
37 ARegion *region = CTX_wm_region(C);
38
39 Scene *sequencer_scene = CTX_data_sequencer_scene(C);
40 if (!sequencer_scene) {
41 return;
42 }
43 Strip *active_strip = seq::select_active_get(sequencer_scene);
44 BLI_assert(active_strip != nullptr);
45 ListBase *modifiers = &active_strip->modifiers;
46
47 const bool panels_match = UI_panel_list_matches_data(region, modifiers, strip_modifier_panel_id);
48
49 if (!panels_match) {
51 LISTBASE_FOREACH (StripModifierData *, smd, modifiers) {
53 if (mti->panel_register == nullptr) {
54 continue;
55 }
56
57 char panel_idname[MAX_NAME];
58 strip_modifier_panel_id(smd, panel_idname);
59
60 /* Create custom data RNA pointer. */
61 PointerRNA *md_ptr = MEM_new<PointerRNA>(__func__);
62 *md_ptr = RNA_pointer_create_discrete(&sequencer_scene->id, &RNA_StripModifier, smd);
63
64 UI_panel_add_instanced(C, region, &region->panels, panel_idname, md_ptr);
65 }
66 }
67 else {
68 /* Assuming there's only one group of instanced panels, update the custom data pointers. */
69 Panel *panel = static_cast<Panel *>(region->panels.first);
70 LISTBASE_FOREACH (StripModifierData *, smd, modifiers) {
72 if (mti->panel_register == nullptr) {
73 continue;
74 }
75
76 /* Move to the next instanced panel corresponding to the next modifier. */
77 while ((panel->type == nullptr) || !(panel->type->flag & PANEL_TYPE_INSTANCED)) {
78 panel = panel->next;
79 /* There shouldn't be fewer panels than modifiers with UIs. */
80 BLI_assert(panel != nullptr);
81 }
82
83 PointerRNA *md_ptr = MEM_new<PointerRNA>(__func__);
84 *md_ptr = RNA_pointer_create_discrete(&sequencer_scene->id, &RNA_StripModifier, smd);
85 UI_panel_custom_data_set(panel, md_ptr);
86
87 panel = panel->next;
88 }
89 }
90}
ARegion * CTX_wm_region(const bContext *C)
Scene * CTX_data_sequencer_scene(const bContext *C)
@ PANEL_TYPE_INSTANCED
#define BLI_assert(a)
Definition BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
#define MAX_NAME
Definition DNA_defs.h:50
eStripModifierType
#define C
Definition RandGen.cpp:29
void UI_panels_free_instanced(const bContext *C, ARegion *region)
void UI_panel_custom_data_set(Panel *panel, PointerRNA *custom_data)
bool UI_panel_list_matches_data(ARegion *region, ListBase *data, uiListPanelIDFromDataFunc panel_idname_func)
Panel * UI_panel_add_instanced(const bContext *C, ARegion *region, ListBase *panels, const char *panel_idname, PointerRNA *custom_data)
static void strip_modifier_panel_id(void *smd_link, char *r_name)
void uiTemplateStripModifiers(uiLayout *, bContext *C)
void modifier_type_panel_id(eStripModifierType type, char *r_idname)
Strip * select_active_get(const Scene *scene)
const StripModifierTypeInfo * modifier_type_info_get(int type)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
ListBase panels
void * first
struct PanelType * type
struct Panel * next
ListBase modifiers
void(* panel_register)(ARegionType *region_type)