Blender V4.3
file_panels.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2009 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_blenlib.h"
10#include "BLI_utildefines.h"
11
12#include "BKE_context.hh"
13#include "BKE_screen.hh"
14
15#include "BLT_translation.hh"
16
17#include "DNA_screen_types.h"
18#include "DNA_space_types.h"
19#include "DNA_userdef_types.h"
20
21#include "MEM_guardedalloc.h"
22
23#include "RNA_access.hh"
24#include "RNA_define.hh"
25#include "RNA_prototypes.hh"
26
27#include "ED_fileselect.hh"
28
29#include "UI_interface.hh"
30#include "UI_interface_icons.hh"
31#include "UI_resources.hh"
32
33#include "WM_api.hh"
34#include "WM_types.hh"
35
36#include "file_intern.hh"
37#include "filelist.hh"
38
39#include <cstring>
40
41static bool file_panel_operator_poll(const bContext *C, PanelType * /*pt*/)
42{
43 SpaceFile *sfile = CTX_wm_space_file(C);
44 return (sfile && sfile->op);
45}
46
47static bool file_panel_asset_browsing_poll(const bContext *C, PanelType * /*pt*/)
48{
49 SpaceFile *sfile = CTX_wm_space_file(C);
50 return sfile && sfile->files && ED_fileselect_is_asset_browser(sfile);
51}
52
53static void file_panel_operator_header(const bContext *C, Panel *panel)
54{
55 SpaceFile *sfile = CTX_wm_space_file(C);
56 wmOperator *op = sfile->op;
57
58 const std::string opname = WM_operatortype_name(op->type, op->ptr);
59 UI_panel_drawname_set(panel, opname);
60}
61
62static void file_panel_operator(const bContext *C, Panel *panel)
63{
64 SpaceFile *sfile = CTX_wm_space_file(C);
65 wmOperator *op = sfile->op;
66
68
69 /* Hack: temporary hide. */
70 const char *hide[] = {"filepath", "files", "directory", "filename"};
71 /* Track overridden properties with #PROP_HIDDEN flag. */
72 bool hidden_override[ARRAY_SIZE(hide)] = {false};
73 for (int i = 0; i < ARRAY_SIZE(hide); i++) {
74 PropertyRNA *prop = RNA_struct_find_property(op->ptr, hide[i]);
75 if (prop && !(RNA_property_flag(prop) & PROP_HIDDEN)) {
77 hidden_override[i] = true;
78 }
79 }
80
83
84 /* Hack: temporary hide. */
85 for (int i = 0; i < ARRAY_SIZE(hide); i++) {
86 PropertyRNA *prop = RNA_struct_find_property(op->ptr, hide[i]);
87 if (prop && hidden_override[i]) {
89 }
90 }
91
92 UI_block_func_set(uiLayoutGetBlock(panel->layout), nullptr, nullptr, nullptr);
93}
94
96{
97 PanelType *pt;
98
99 pt = static_cast<PanelType *>(
100 MEM_callocN(sizeof(PanelType), "spacetype file operator properties"));
101 STRNCPY(pt->idname, "FILE_PT_operator");
102 STRNCPY(pt->label, N_("Operator"));
108 BLI_addtail(&art->paneltypes, pt);
109}
110
112{
113 uiLayout *row = uiLayoutRow(layout, false);
114 uiLayoutSetScaleX(row, 0.8f);
115 uiLayoutSetFixedSize(row, true);
116 uiItemO(row, IFACE_("Cancel"), ICON_NONE, "FILE_OT_cancel");
117}
118
119static void file_panel_execution_execute_button(uiLayout *layout, const char *title)
120{
121 uiLayout *row = uiLayoutRow(layout, false);
122 uiLayoutSetScaleX(row, 0.8f);
123 uiLayoutSetFixedSize(row, true);
124 /* Just a display hint. */
125 uiLayoutSetActiveDefault(row, true);
126 uiItemO(row, title, ICON_NONE, "FILE_OT_execute");
127}
128
130{
131 bScreen *screen = CTX_wm_screen(C);
132 SpaceFile *sfile = CTX_wm_space_file(C);
134 uiBlock *block = uiLayoutGetBlock(panel->layout);
135 uiBut *but;
136 uiLayout *row;
137 PointerRNA *but_extra_rna_ptr;
138
139 const bool overwrite_alert = file_draw_check_exists(sfile);
140 const bool windows_layout =
141#ifdef _WIN32
142 true;
143#else
144 false;
145#endif
146
147 PointerRNA params_rna_ptr = RNA_pointer_create(&screen->id, &RNA_FileSelectParams, params);
148
149 row = uiLayoutRow(panel->layout, false);
150 uiLayoutSetScaleY(row, 1.3f);
151
152 /* callbacks for operator check functions */
153 UI_block_func_set(block, file_draw_check_cb, nullptr, nullptr);
154
155 but = uiDefButR(block,
157 -1,
158 "",
159 0,
160 0,
161 UI_UNIT_X * 5,
162 UI_UNIT_Y,
163 &params_rna_ptr,
164 "filename",
165 0,
166 0.0f,
167 float(FILE_MAXFILE),
168 overwrite_alert ? TIP_("File name, overwrite existing") : TIP_("File name"));
169
172
174 /* silly workaround calling NFunc to ensure this does not get called
175 * immediate ui_apply_but_func but only after button deactivates */
177
178 if (params->flag & FILE_CHECK_EXISTING) {
179 but_extra_rna_ptr = UI_but_extra_operator_icon_add(
180 but, "FILE_OT_filenum", WM_OP_EXEC_REGION_WIN, ICON_REMOVE);
181 RNA_int_set(but_extra_rna_ptr, "increment", -1);
182 but_extra_rna_ptr = UI_but_extra_operator_icon_add(
183 but, "FILE_OT_filenum", WM_OP_EXEC_REGION_WIN, ICON_ADD);
184 RNA_int_set(but_extra_rna_ptr, "increment", 1);
185 }
186
187 /* check if this overrides a file and if the operator option is used */
188 if (overwrite_alert) {
190 }
191 UI_block_func_set(block, nullptr, nullptr, nullptr);
192
193 {
194 uiLayout *sub = uiLayoutRow(row, false);
196
197 if (windows_layout) {
200 }
201 else {
204 }
205 }
206}
207
209{
210 PanelType *pt;
211
212 pt = static_cast<PanelType *>(
213 MEM_callocN(sizeof(PanelType), "spacetype file execution buttons"));
214 STRNCPY(pt->idname, "FILE_PT_execution_buttons");
215 STRNCPY(pt->label, N_("Execute Buttons"));
220 BLI_addtail(&art->paneltypes, pt);
221}
222
224{
225 bScreen *screen = CTX_wm_screen(C);
226 SpaceFile *sfile = CTX_wm_space_file(C);
227 /* May be null if the library wasn't loaded yet. */
230 BLI_assert(params != nullptr);
231
232 uiLayout *col = uiLayoutColumn(panel->layout, false);
233 uiLayout *row = uiLayoutRow(col, true);
234
235 PointerRNA params_ptr = RNA_pointer_create(&screen->id, &RNA_FileAssetSelectParams, params);
236
237 uiItemR(row, &params_ptr, "asset_library_reference", UI_ITEM_NONE, "", ICON_NONE);
238 if (params->asset_library_ref.type == ASSET_LIBRARY_LOCAL) {
239 bContext *mutable_ctx = CTX_copy(C);
240 if (WM_operator_name_poll(mutable_ctx, "asset.bundle_install")) {
241 uiItemS(col);
243 C,
244 "asset.bundle_install",
245 "asset_library_reference",
246 "Copy Bundle to Asset Library...",
247 ICON_IMPORT);
248 }
249 CTX_free(mutable_ctx);
250 }
251 else {
252 uiItemO(row, "", ICON_FILE_REFRESH, "ASSET_OT_library_refresh");
253 }
254
255 uiItemS(col);
256
258 asset_library, col, sfile, params);
259}
260
262{
263 PanelType *pt;
264
265 pt = static_cast<PanelType *>(
266 MEM_callocN(sizeof(PanelType), "spacetype file asset catalog buttons"));
267 STRNCPY(pt->idname, "FILE_PT_asset_catalog_buttons");
268 STRNCPY(pt->label, N_("Asset Catalogs"));
273 BLI_addtail(&art->paneltypes, pt);
274}
bScreen * CTX_wm_screen(const bContext *C)
SpaceFile * CTX_wm_space_file(const bContext *C)
bContext * CTX_copy(const bContext *C)
void CTX_free(bContext *C)
@ PANEL_TYPE_NO_HEADER
#define BLI_assert(a)
Definition BLI_assert.h:50
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
#define FILE_MAXFILE
#define STRNCPY(dst, src)
Definition BLI_string.h:593
#define ARRAY_SIZE(arr)
#define TIP_(msgid)
#define IFACE_(msgid)
#define BLT_I18NCONTEXT_DEFAULT_BPYRNA
@ ASSET_LIBRARY_LOCAL
@ FILE_CHECK_EXISTING
FileSelectParams * ED_fileselect_get_active_params(const SpaceFile *sfile)
Definition filesel.cc:380
bool ED_fileselect_is_asset_browser(const SpaceFile *sfile)
Definition filesel.cc:467
FileAssetSelectParams * ED_fileselect_get_asset_params(const SpaceFile *sfile)
Definition filesel.cc:403
Read Guarded memory(de)allocation.
@ PROP_HIDDEN
Definition RNA_types.hh:239
#define UI_UNIT_Y
@ UI_TEMPLATE_OP_PROPS_SHOW_EMPTY
void uiLayoutSetFixedSize(uiLayout *layout, bool fixed_size)
void uiItemMenuEnumO(uiLayout *layout, const bContext *C, const char *opname, const char *propname, const char *name, int icon)
void uiLayoutSetScaleY(uiLayout *layout, float scale)
void UI_panel_drawname_set(Panel *panel, blender::StringRef name)
void uiLayoutSetActiveDefault(uiLayout *layout, bool active_default)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
bool UI_but_is_utf8(const uiBut *but)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetScaleX(uiLayout *layout, float scale)
void uiItemS(uiLayout *layout)
@ UI_BUT_LABEL_ALIGN_NONE
PointerRNA * UI_but_extra_operator_icon_add(uiBut *but, const char *opname, wmOperatorCallContext opcontext, int icon)
#define UI_ITEM_NONE
void uiTemplateOperatorPropertyButs(const bContext *C, uiLayout *layout, wmOperator *op, eButLabelAlign label_align, short flag)
void UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void UI_but_func_complete_set(uiBut *but, uiButCompleteFunc func, void *arg)
#define UI_UNIT_X
@ UI_BTYPE_TEXT
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
uiBut * uiDefButR(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, PointerRNA *ptr, const char *propname, int index, float min, float max, const char *tip)
void UI_but_funcN_set(uiBut *but, uiButHandleNFunc funcN, void *argN, void *arg2, uiButArgNFree func_argN_free_fn=MEM_freeN, uiButArgNCopy func_argN_copy_fn=MEM_dupallocN)
void UI_but_flag_enable(uiBut *but, int flag)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
bool UI_but_flag_is_set(uiBut *but, int flag)
@ UI_BUT_REDALERT
@ UI_BUT_UNDO
@ WM_OP_EXEC_REGION_WIN
Definition WM_types.hh:226
int autocomplete_file(bContext *C, char *str, void *arg_v)
Definition filesel.cc:1269
void file_filename_enter_handle(bContext *C, void *arg_unused, void *arg_but)
Definition file_ops.cc:2910
bool file_draw_check_exists(SpaceFile *sfile)
Definition file_ops.cc:1765
void file_draw_check_cb(bContext *C, void *arg1, void *arg2)
Definition file_ops.cc:1760
static bool file_panel_operator_poll(const bContext *C, PanelType *)
static bool file_panel_asset_browsing_poll(const bContext *C, PanelType *)
static void file_panel_execution_execute_button(uiLayout *layout, const char *title)
static void file_panel_execution_cancel_button(uiLayout *layout)
void file_execute_region_panels_register(ARegionType *art)
static void file_panel_execution_buttons_draw(const bContext *C, Panel *panel)
static void file_panel_operator_header(const bContext *C, Panel *panel)
static void file_panel_asset_catalog_buttons_draw(const bContext *C, Panel *panel)
void file_tool_props_region_panels_register(ARegionType *art)
static void file_panel_operator(const bContext *C, Panel *panel)
void file_tools_region_panels_register(ARegionType *art)
blender::asset_system::AssetLibrary * filelist_asset_library(FileList *filelist)
Definition filelist.cc:2007
uint col
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
void file_create_asset_catalog_tree_view_in_layout(asset_system::AssetLibrary *asset_library, uiLayout *layout, SpaceFile *space_file, FileAssetSelectParams *params)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
int RNA_property_flag(PropertyRNA *prop)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
ListBase paneltypes
void(* draw)(const bContext *C, Panel *panel)
char idname[BKE_ST_MAXNAME]
bool(* poll)(const bContext *C, PanelType *pt)
char translation_context[BKE_ST_MAXNAME]
char label[BKE_ST_MAXNAME]
void(* draw_header)(const bContext *C, Panel *panel)
struct uiLayout * layout
struct wmOperator * op
struct FileList * files
struct wmOperatorType * type
struct PointerRNA * ptr
#define N_(msgid)
bool WM_operator_name_poll(bContext *C, const char *opstring)
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)