Blender  V3.3
file_panels.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2009 Blender Foundation. All rights reserved. */
3 
8 #include "BLI_blenlib.h"
9 #include "BLI_utildefines.h"
10 
11 #include "BKE_context.h"
12 #include "BKE_screen.h"
13 
14 #include "BLT_translation.h"
15 
16 #include "DNA_screen_types.h"
17 #include "DNA_space_types.h"
18 #include "DNA_userdef_types.h"
19 
20 #include "MEM_guardedalloc.h"
21 
22 #include "RNA_access.h"
23 #include "RNA_define.h"
24 #include "RNA_prototypes.h"
25 
26 #include "ED_fileselect.h"
27 
28 #include "UI_interface.h"
29 #include "UI_interface_icons.h"
30 #include "UI_resources.h"
31 
32 #include "WM_api.h"
33 #include "WM_types.h"
34 
35 #include "file_intern.h"
36 #include "filelist.h"
37 #include "fsmenu.h"
38 
39 #include <string.h>
40 
42 {
43  SpaceFile *sfile = CTX_wm_space_file(C);
44  return (sfile && sfile->op);
45 }
46 
48 {
49  SpaceFile *sfile = CTX_wm_space_file(C);
50  return sfile && sfile->files && ED_fileselect_is_asset_browser(sfile);
51 }
52 
53 static 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  BLI_strncpy(panel->drawname, WM_operatortype_name(op->type, op->ptr), sizeof(panel->drawname));
59 }
60 
61 static void file_panel_operator(const bContext *C, Panel *panel)
62 {
63  SpaceFile *sfile = CTX_wm_space_file(C);
64  wmOperator *op = sfile->op;
65 
67 
68  /* Hack: temporary hide. */
69  const char *hide[] = {"filepath", "files", "directory", "filename"};
70  for (int i = 0; i < ARRAY_SIZE(hide); i++) {
71  PropertyRNA *prop = RNA_struct_find_property(op->ptr, hide[i]);
72  if (prop) {
74  }
75  }
76 
79 
80  /* Hack: temporary hide. */
81  for (int i = 0; i < ARRAY_SIZE(hide); i++) {
82  PropertyRNA *prop = RNA_struct_find_property(op->ptr, hide[i]);
83  if (prop) {
85  }
86  }
87 
89 }
90 
92 {
93  PanelType *pt;
94 
95  pt = MEM_callocN(sizeof(PanelType), "spacetype file operator properties");
96  strcpy(pt->idname, "FILE_PT_operator");
97  strcpy(pt->label, N_("Operator"));
103  BLI_addtail(&art->paneltypes, pt);
104 }
105 
107 {
108  uiLayout *row = uiLayoutRow(layout, false);
109  uiLayoutSetScaleX(row, 0.8f);
110  uiLayoutSetFixedSize(row, true);
111  uiItemO(row, IFACE_("Cancel"), ICON_NONE, "FILE_OT_cancel");
112 }
113 
114 static void file_panel_execution_execute_button(uiLayout *layout, const char *title)
115 {
116  uiLayout *row = uiLayoutRow(layout, false);
117  uiLayoutSetScaleX(row, 0.8f);
118  uiLayoutSetFixedSize(row, true);
119  /* Just a display hint. */
120  uiLayoutSetActiveDefault(row, true);
121  uiItemO(row, title, ICON_NONE, "FILE_OT_execute");
122 }
123 
125 {
126  bScreen *screen = CTX_wm_screen(C);
127  SpaceFile *sfile = CTX_wm_space_file(C);
129  uiBlock *block = uiLayoutGetBlock(panel->layout);
130  uiBut *but;
131  uiLayout *row;
132  PointerRNA params_rna_ptr, *but_extra_rna_ptr;
133 
134  const bool overwrite_alert = file_draw_check_exists(sfile);
135  const bool windows_layout =
136 #ifdef _WIN32
137  true;
138 #else
139  false;
140 #endif
141 
142  RNA_pointer_create(&screen->id, &RNA_FileSelectParams, params, &params_rna_ptr);
143 
144  row = uiLayoutRow(panel->layout, false);
145  uiLayoutSetScaleY(row, 1.3f);
146 
147  /* callbacks for operator check functions */
149 
150  but = uiDefButR(block,
152  -1,
153  "",
154  0,
155  0,
156  UI_UNIT_X * 5,
157  UI_UNIT_Y,
158  &params_rna_ptr,
159  "filename",
160  0,
161  0.0f,
162  (float)FILE_MAXFILE,
163  0,
164  0,
165  TIP_(overwrite_alert ? N_("File name, overwrite existing") : N_("File name")));
166 
168  BLI_assert(!UI_but_is_utf8(but));
169 
171  /* silly workaround calling NFunc to ensure this does not get called
172  * immediate ui_apply_but_func but only after button deactivates */
174 
175  if (params->flag & FILE_CHECK_EXISTING) {
176  but_extra_rna_ptr = UI_but_extra_operator_icon_add(
177  but, "FILE_OT_filenum", WM_OP_EXEC_REGION_WIN, ICON_REMOVE);
178  RNA_int_set(but_extra_rna_ptr, "increment", -1);
179  but_extra_rna_ptr = UI_but_extra_operator_icon_add(
180  but, "FILE_OT_filenum", WM_OP_EXEC_REGION_WIN, ICON_ADD);
181  RNA_int_set(but_extra_rna_ptr, "increment", 1);
182  }
183 
184  /* check if this overrides a file and if the operator option is used */
185  if (overwrite_alert) {
187  }
188  UI_block_func_set(block, NULL, NULL, NULL);
189 
190  {
191  uiLayout *sub = uiLayoutRow(row, false);
193 
194  if (windows_layout) {
197  }
198  else {
201  }
202  }
203 }
204 
206 {
207  PanelType *pt;
208 
209  pt = MEM_callocN(sizeof(PanelType), "spacetype file execution buttons");
210  strcpy(pt->idname, "FILE_PT_execution_buttons");
211  strcpy(pt->label, N_("Execute Buttons"));
216  BLI_addtail(&art->paneltypes, pt);
217 }
218 
220 {
221  bScreen *screen = CTX_wm_screen(C);
222  SpaceFile *sfile = CTX_wm_space_file(C);
223  /* May be null if the library wasn't loaded yet. */
224  struct AssetLibrary *asset_library = filelist_asset_library(sfile->files);
226  BLI_assert(params != NULL);
227 
228  uiLayout *col = uiLayoutColumn(panel->layout, false);
229  uiLayout *row = uiLayoutRow(col, true);
230 
231  PointerRNA params_ptr;
232  RNA_pointer_create(&screen->id, &RNA_FileAssetSelectParams, params, &params_ptr);
233 
234  uiItemR(row, &params_ptr, "asset_library_ref", 0, "", ICON_NONE);
235  if (params->asset_library_ref.type == ASSET_LIBRARY_LOCAL) {
236  bContext *mutable_ctx = CTX_copy(C);
237  if (WM_operator_name_poll(mutable_ctx, "asset.bundle_install")) {
238  uiItemS(col);
240  mutable_ctx,
241  "asset.bundle_install",
242  "asset_library_ref",
243  "Copy Bundle to Asset Library...",
244  ICON_IMPORT);
245  }
246  CTX_free(mutable_ctx);
247  }
248  else {
249  uiItemO(row, "", ICON_FILE_REFRESH, "ASSET_OT_library_refresh");
250  }
251 
252  uiItemS(col);
253 
255 }
256 
258 {
259  PanelType *pt;
260 
261  pt = MEM_callocN(sizeof(PanelType), "spacetype file asset catalog buttons");
262  strcpy(pt->idname, "FILE_PT_asset_catalog_buttons");
263  strcpy(pt->label, N_("Asset Catalogs"));
268  BLI_addtail(&art->paneltypes, pt);
269 }
struct AssetLibrary AssetLibrary
bContext * CTX_copy(const bContext *C)
Definition: context.c:109
void CTX_free(bContext *C)
Definition: context.c:118
struct bScreen * CTX_wm_screen(const bContext *C)
Definition: context.c:733
struct SpaceFile * CTX_wm_space_file(const bContext *C)
Definition: context.c:842
@ PANEL_TYPE_NO_HEADER
Definition: BKE_screen.h:280
#define BLI_assert(a)
Definition: BLI_assert.h:46
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:80
#define FILE_MAXFILE
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
#define ARRAY_SIZE(arr)
#define UNUSED(x)
#define TIP_(msgid)
#define IFACE_(msgid)
#define BLT_I18NCONTEXT_DEFAULT_BPYRNA
@ ASSET_LIBRARY_LOCAL
@ FILE_CHECK_EXISTING
struct FileAssetSelectParams * ED_fileselect_get_asset_params(const struct SpaceFile *sfile)
bool ED_fileselect_is_asset_browser(const struct SpaceFile *sfile)
struct FileSelectParams * ED_fileselect_get_active_params(const struct SpaceFile *sfile)
Read Guarded memory(de)allocation.
@ PROP_HIDDEN
Definition: RNA_types.h:216
#define C
Definition: RandGen.cpp:25
#define UI_UNIT_Y
uiBlock * uiLayoutGetBlock(uiLayout *layout)
@ UI_BUT_REDALERT
Definition: UI_interface.h:201
@ UI_BUT_UNDO
Definition: UI_interface.h:205
void uiTemplateOperatorPropertyButs(const struct bContext *C, uiLayout *layout, struct wmOperator *op, eButLabelAlign label_align, short flag)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetFixedSize(uiLayout *layout, bool fixed_size)
void uiLayoutSetScaleY(uiLayout *layout, float scale)
void uiItemMenuEnumO(uiLayout *layout, struct bContext *C, const char *opname, const char *propname, const char *name, int icon)
void uiLayoutSetActiveDefault(uiLayout *layout, bool active_default)
bool UI_but_is_utf8(const uiBut *but)
void uiLayoutSetScaleX(uiLayout *layout, float scale)
@ UI_TEMPLATE_OP_PROPS_SHOW_EMPTY
void uiItemS(uiLayout *layout)
@ UI_BUT_LABEL_ALIGN_NONE
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
uiBut * uiDefButR(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
Definition: interface.cc:5258
void UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2)
Definition: interface.cc:5965
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
struct PointerRNA * UI_but_extra_operator_icon_add(uiBut *but, const char *opname, wmOperatorCallContext opcontext, int icon)
Definition: interface.cc:1682
void UI_but_func_complete_set(uiBut *but, uiButCompleteFunc func, void *arg)
Definition: interface.cc:6018
void UI_but_funcN_set(uiBut *but, uiButHandleNFunc funcN, void *argN, void *arg2)
Definition: interface.cc:6007
#define UI_UNIT_X
@ UI_BTYPE_TEXT
Definition: UI_interface.h:332
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
void UI_but_flag_enable(uiBut *but, int flag)
Definition: interface.cc:5858
bool UI_but_flag_is_set(uiBut *but, int flag)
Definition: interface.cc:5868
@ WM_OP_EXEC_REGION_WIN
Definition: WM_types.h:209
void file_create_asset_catalog_tree_view_in_layout(::AssetLibrary *asset_library, uiLayout *layout, SpaceFile *space_file, FileAssetSelectParams *params)
int autocomplete_file(struct bContext *C, char *str, void *arg_v)
void file_filename_enter_handle(bContext *C, void *arg_unused, void *arg_but)
bool file_draw_check_exists(SpaceFile *sfile)
Definition: file_ops.c:1746
void file_draw_check_cb(bContext *C, void *arg1, void *arg2)
static bool file_panel_asset_browsing_poll(const bContext *C, PanelType *UNUSED(pt))
Definition: file_panels.c:47
static void file_panel_execution_execute_button(uiLayout *layout, const char *title)
Definition: file_panels.c:114
static void file_panel_execution_cancel_button(uiLayout *layout)
Definition: file_panels.c:106
void file_execute_region_panels_register(ARegionType *art)
Definition: file_panels.c:205
static void file_panel_execution_buttons_draw(const bContext *C, Panel *panel)
Definition: file_panels.c:124
static void file_panel_operator_header(const bContext *C, Panel *panel)
Definition: file_panels.c:53
static bool file_panel_operator_poll(const bContext *C, PanelType *UNUSED(pt))
Definition: file_panels.c:41
static void file_panel_asset_catalog_buttons_draw(const bContext *C, Panel *panel)
Definition: file_panels.c:219
void file_tool_props_region_panels_register(ARegionType *art)
Definition: file_panels.c:91
static void file_panel_operator(const bContext *C, Panel *panel)
Definition: file_panels.c:61
void file_tools_region_panels_register(ARegionType *art)
Definition: file_panels.c:257
AssetLibrary * filelist_asset_library(FileList *filelist)
Definition: filelist.c:2042
uint col
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
Definition: rna_access.c:136
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:4921
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:717
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
Definition: rna_define.c:1495
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
Definition: rna_define.c:1490
ListBase paneltypes
Definition: BKE_screen.h:198
void(* draw)(const struct bContext *C, struct Panel *panel)
Definition: BKE_screen.h:248
bool(* poll)(const struct bContext *C, struct PanelType *pt)
Definition: BKE_screen.h:242
void(* draw_header)(const struct bContext *C, struct Panel *panel)
Definition: BKE_screen.h:244
char idname[BKE_ST_MAXNAME]
Definition: BKE_screen.h:223
char translation_context[BKE_ST_MAXNAME]
Definition: BKE_screen.h:226
char label[BKE_ST_MAXNAME]
Definition: BKE_screen.h:224
struct uiLayout * layout
char drawname[64]
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)
const char * WM_operatortype_name(struct wmOperatorType *ot, struct PointerRNA *properties)