Blender V4.3
file_draw.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cerrno>
10#include <cmath>
11#include <cstring>
12#include <string>
13
14#include <fmt/format.h>
15
16#include "MEM_guardedalloc.h"
17
19
20#include "BLI_blenlib.h"
21#include "BLI_fileops_types.h"
22#include "BLI_math_color.h"
23#include "BLI_utildefines.h"
24
25#ifdef WIN32
26# include "BLI_winstuff.h"
27#endif
28
29#include "BIF_glutil.hh"
30
31#include "BKE_blendfile.hh"
32#include "BKE_context.hh"
33#include "BKE_report.hh"
34
35#include "BLO_readfile.hh"
36
37#include "BLT_translation.hh"
38
39#include "BLF_api.hh"
40
41#include "IMB_imbuf.hh"
42#include "IMB_imbuf_types.hh"
43#include "IMB_metadata.hh"
44#include "IMB_thumbs.hh"
45
46#include "DNA_userdef_types.h"
48
49#include "RNA_access.hh"
50#include "RNA_prototypes.hh"
51
52#include "ED_asset.hh"
53#include "ED_fileselect.hh"
54#include "ED_screen.hh"
55
56#include "UI_interface.hh"
57#include "UI_interface_icons.hh"
58#include "UI_resources.hh"
59#include "UI_view2d.hh"
60
61#include "WM_api.hh"
62#include "WM_types.hh"
63
64#include "GPU_immediate.hh"
65#include "GPU_immediate_util.hh"
66#include "GPU_state.hh"
67
68#include "filelist.hh"
69
70#include "file_intern.hh" /* own include */
71
73 const SpaceFile *sfile,
75 uiBlock *block)
76{
77 uiBut *but;
78
79 BLI_assert_msg(params != nullptr,
80 "File select parameters not set. The caller is expected to check this.");
81
82 PointerRNA params_rna_ptr = RNA_pointer_create(&screen->id, &RNA_FileSelectParams, params);
83
84 /* callbacks for operator check functions */
85 UI_block_func_set(block, file_draw_check_cb, nullptr, nullptr);
86
87 but = uiDefButR(block,
89 -1,
90 "",
91 0,
92 0,
93 UI_UNIT_X * 10,
95 &params_rna_ptr,
96 "directory",
97 0,
98 0.0f,
99 float(FILE_MAX),
100 TIP_("File path"));
101
104
107
108 /* TODO: directory editing is non-functional while a library is loaded
109 * until this is properly supported just disable it. */
110 if (sfile && sfile->files && filelist_lib(sfile->files)) {
112 }
113
114 /* clear func */
115 UI_block_func_set(block, nullptr, nullptr, nullptr);
116}
117
122
124{
126 data->sfile = sfile;
127 data->file = file;
128 return data;
129}
130
131static void file_draw_tooltip_custom_func(bContext & /*C*/, uiTooltipData &tip, void *argN)
132{
133 FileTooltipData *file_data = static_cast<FileTooltipData *>(argN);
134 const SpaceFile *sfile = file_data->sfile;
135 const FileList *files = sfile->files;
137 const FileDirEntry *file = file_data->file;
138
139 BLI_assert_msg(!file->asset, "Asset tooltip should never be overridden here.");
140
141 /* Check the FileDirEntry first to see if the preview is already loaded. */
142 ImBuf *thumb = filelist_file_getimage(file);
143
144 /* Only free if it is loaded later. */
145 bool free_imbuf = (thumb == nullptr);
146
149
150 if (!(file->typeflag & FILE_TYPE_BLENDERLIB)) {
151
152 char full_path[FILE_MAX_LIBEXTRA];
153 filelist_file_get_full_path(files, file, full_path);
154
155 if (params->recursion_level > 0) {
156 char root[FILE_MAX];
157 BLI_path_split_dir_part(full_path, root, FILE_MAX);
159 }
160
161 if (file->redirection_path) {
163 fmt::format("{}: {}", N_("Link target"), file->redirection_path),
164 {},
167 }
168 if (file->attributes & FILE_ATTR_OFFLINE) {
170 tip, N_("This file is offline"), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_ALERT);
171 }
172 if (file->attributes & FILE_ATTR_READONLY) {
174 tip, N_("This file is read-only"), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_ALERT);
175 }
178 tip, N_("This is a restricted system file"), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_ALERT);
179 }
180
182 char version_str[128] = {0};
183 if (!thumb) {
184 /* Load the thumbnail from cache if existing, but don't create if not. */
185 thumb = IMB_thumb_read(full_path, THB_LARGE);
186 }
187 if (thumb) {
188 /* Look for version in existing thumbnail if available. */
190 thumb->metadata, "Thumb::Blender::Version", version_str, sizeof(version_str));
191 }
192
193 if (!version_str[0] && !(file->attributes & FILE_ATTR_OFFLINE)) {
194 /* Load Blender version directly from the file. */
195 short version = BLO_version_from_file(full_path);
196 if (version != 0) {
197 SNPRINTF(version_str, "%d.%01d", version / 100, version % 100);
198 }
199 }
200
201 if (version_str[0]) {
203 fmt::format("Blender {}", version_str),
204 {},
208 }
209 }
210 else if (file->typeflag & FILE_TYPE_IMAGE) {
211 if (!thumb) {
212 /* Load the thumbnail from cache if existing, create if not. */
213 thumb = IMB_thumb_manage(full_path, THB_LARGE, THB_SOURCE_IMAGE);
214 }
215 if (thumb) {
216 char value1[128];
217 char value2[128];
219 thumb->metadata, "Thumb::Image::Width", value1, sizeof(value1)) &&
221 thumb->metadata, "Thumb::Image::Height", value2, sizeof(value2)))
222 {
224 fmt::format("{} \u00D7 {}", value1, value2),
225 {},
229 }
230 }
231 }
232 else if (file->typeflag & FILE_TYPE_MOVIE) {
233 if (!thumb) {
234 /* This could possibly take a while. */
235 thumb = IMB_thumb_manage(full_path, THB_LARGE, THB_SOURCE_MOVIE);
236 }
237 if (thumb) {
238 char value1[128];
239 char value2[128];
240 char value3[128];
242 thumb->metadata, "Thumb::Video::Width", value1, sizeof(value1)) &&
244 thumb->metadata, "Thumb::Video::Height", value2, sizeof(value2)))
245 {
247 fmt::format("{} \u00D7 {}", value1, value2),
248 {},
251 }
253 thumb->metadata, "Thumb::Video::Frames", value1, sizeof(value1)) &&
254 IMB_metadata_get_field(thumb->metadata, "Thumb::Video::FPS", value2, sizeof(value2)) &&
256 thumb->metadata, "Thumb::Video::Duration", value3, sizeof(value3)))
257 {
259 tip,
260 fmt::format("{} {} @ {} {}", value1, N_("Frames"), value2, N_("FPS")),
261 {},
265 fmt::format("{} {}", value3, N_("seconds")),
266 {},
270 }
271 }
272 }
273
275 bool is_today, is_yesterday;
276 std::string day_string = ("");
278 nullptr, file->time, false, time_str, date_str, &is_today, &is_yesterday);
279 if (is_today || is_yesterday) {
280 day_string = (is_today ? N_("Today") : N_("Yesterday")) + std::string(" ");
281 }
283 fmt::format("{}: {}{}{}",
284 N_("Modified"),
285 day_string,
286 (is_today || is_yesterday) ? "" : date_str,
287 (is_today || is_yesterday) ? time_str : ""),
288 {},
291
292 if (!(file->typeflag & FILE_TYPE_DIR) && file->size > 0) {
293 char size[16];
294 BLI_filelist_entry_size_to_string(nullptr, file->size, false, size);
295 if (file->size < 10000) {
297 BLI_str_format_uint64_grouped(size_full, file->size);
299 tip,
300 fmt::format("{}: {} ({} {})", N_("Size"), size, size_full, N_("bytes")),
301 {},
304 }
305 else {
307 fmt::format("{}: {}", N_("Size"), size),
308 {},
311 }
312 }
313 }
314
315 if (thumb && params->display != FILE_IMGDISPLAY) {
318
319 uiTooltipImage image_data;
320 float scale = (96.0f * UI_SCALE_FAC) / float(std::max(thumb->x, thumb->y));
321 image_data.ibuf = thumb;
322 image_data.width = short(float(thumb->x) * scale);
323 image_data.height = short(float(thumb->y) * scale);
324 image_data.border = true;
325 image_data.background = uiTooltipImageBackground::Checkerboard_Themed;
326 image_data.premultiplied = true;
327 UI_tooltip_image_field_add(tip, image_data);
328 }
329
330 if (thumb && free_imbuf) {
331 IMB_freeImBuf(thumb);
332 }
333}
334
335static std::string file_draw_asset_tooltip_func(bContext * /*C*/, void *argN, const char * /*tip*/)
336{
337 const auto *asset = static_cast<blender::asset_system::AssetRepresentation *>(argN);
339}
340
341static void draw_tile_background(const rcti *draw_rect, int colorid, int shade)
342{
343 float color[4];
344 rctf draw_rect_fl;
345 BLI_rctf_rcti_copy(&draw_rect_fl, draw_rect);
346
347 UI_GetThemeColorShade4fv(colorid, shade, color);
349 UI_draw_roundbox_aa(&draw_rect_fl, true, 5.0f, color);
350}
351
353 const SpaceFile *sfile,
354 const FileDirEntry *file,
355 const char *path,
356 const ImBuf *preview_image,
357 int icon,
358 float scale)
359{
360 ID *id;
361
362 if ((id = filelist_file_get_id(file))) {
363 UI_but_drag_set_id(but, id);
364 if (preview_image) {
365 UI_but_drag_attach_image(but, preview_image, scale);
366 }
367 }
368 else if (sfile->browse_mode == FILE_BROWSE_MODE_ASSETS &&
369 (file->typeflag & FILE_TYPE_ASSET) != 0)
370 {
371 const int import_method = ED_fileselect_asset_import_method_get(sfile, file);
372 BLI_assert(import_method > -1);
373
374 UI_but_drag_set_asset(but, file->asset, import_method, icon, preview_image, scale);
375 }
376 else if (preview_image) {
377 UI_but_drag_set_image(but, path, icon, preview_image, scale);
378 }
379 else {
380 /* path is no more static, cannot give it directly to but... */
381 UI_but_drag_set_path(but, path);
382 }
383}
384
385static uiBut *file_add_icon_but(const SpaceFile *sfile,
386 uiBlock *block,
387 const char * /*path*/,
388 const FileDirEntry *file,
389 const rcti *tile_draw_rect,
390 int icon,
391 int width,
392 int height,
393 bool dimmed)
394{
395 uiBut *but;
396
397 const int x = tile_draw_rect->xmin;
398 const int y = tile_draw_rect->ymax - sfile->layout->tile_border_y - height;
399
400 but = uiDefIconBut(
401 block, UI_BTYPE_LABEL, 0, icon, x, y, width, height, nullptr, 0.0f, 0.0f, nullptr);
402 UI_but_label_alpha_factor_set(but, dimmed ? 0.3f : 1.0f);
403 if (file->asset) {
405 }
406 else {
409 }
410
411 return but;
412}
413
414static void file_draw_string(int sx,
415 int sy,
416 const char *string,
417 float width,
418 int height,
419 eFontStyle_Align align,
420 const uchar col[4])
421{
422 uiFontStyle fs;
423 rcti rect;
424 char filename[FILE_MAXFILE];
425
426 if (string[0] == '\0' || width < 1) {
427 return;
428 }
429
430 const uiStyle *style = UI_style_get();
431 fs = style->widget;
432
433 STRNCPY(filename, string);
434 UI_text_clip_middle_ex(&fs, filename, width, UI_ICON_SIZE, sizeof(filename), '\0');
435
436 /* no text clipping needed, UI_fontstyle_draw does it but is a bit too strict
437 * (for buttons it works) */
438 rect.xmin = sx;
439 rect.xmax = sx + round_fl_to_int(width);
440 rect.ymin = sy - height;
441 rect.ymax = sy;
442
443 uiFontStyleDraw_Params font_style_params{};
444 font_style_params.align = align;
445
446 UI_fontstyle_draw(&fs, &rect, filename, sizeof(filename), col, &font_style_params);
447}
448
454static void file_draw_string_multiline(int sx,
455 int sy,
456 const char *string,
457 int wrap_width,
458 int line_height,
459 const uchar text_col[4],
460 int *r_sx,
461 int *r_sy)
462{
463 rcti rect;
464
465 if (string[0] == '\0' || wrap_width < 1) {
466 return;
467 }
468
469 const uiStyle *style = UI_style_get();
470 int font_id = style->widget.uifont_id;
471 int len = strlen(string);
472
473 rcti textbox;
474 BLF_wordwrap(font_id, wrap_width);
475 BLF_enable(font_id, BLF_WORD_WRAP);
476 BLF_boundbox(font_id, string, len, &textbox);
477 BLF_disable(font_id, BLF_WORD_WRAP);
478
479 /* no text clipping needed, UI_fontstyle_draw does it but is a bit too strict
480 * (for buttons it works) */
481 rect.xmin = sx;
482 rect.xmax = sx + wrap_width;
483 /* Need to increase the clipping rect by one more line, since the #UI_fontstyle_draw_ex() will
484 * actually start drawing at (ymax - line-height). */
485 rect.ymin = sy - BLI_rcti_size_y(&textbox) - line_height;
486 rect.ymax = sy;
487
488 uiFontStyleDraw_Params font_style_params{};
489 font_style_params.align = UI_STYLE_TEXT_LEFT;
490 font_style_params.word_wrap = true;
491
494 &style->widget, &rect, string, len, text_col, &font_style_params, nullptr, nullptr, &result);
495 if (r_sx) {
496 *r_sx = result.width;
497 }
498 if (r_sy) {
499 *r_sy = rect.ymin + line_height;
500 }
501}
502
504{
505 SpaceFile *sfile = CTX_wm_space_file(C);
506 View2D *v2d = &region->v2d;
507
508 ED_fileselect_init_layout(sfile, region);
509 UI_view2d_totRect_set(v2d, sfile->layout->width, sfile->layout->height);
510}
511
512static void file_add_preview_drag_but(const SpaceFile *sfile,
513 uiBlock *block,
514 FileLayout *layout,
515 const FileDirEntry *file,
516 const char *path,
517 const rcti *tile_draw_rect,
518 const ImBuf *preview_image,
519 const int icon,
520 const float scale)
521{
522 /* Invisible button for dragging. */
523 rcti drag_rect = *tile_draw_rect;
524 /* A bit smaller than the full tile, to increase the gap between items that users can drag from
525 * for box select. */
526 BLI_rcti_pad(&drag_rect, -layout->tile_border_x, -layout->tile_border_y);
527
528 uiBut *but = uiDefBut(block,
530 0,
531 "",
532 drag_rect.xmin,
533 drag_rect.ymin,
534 BLI_rcti_size_x(&drag_rect),
535 BLI_rcti_size_y(&drag_rect),
536 nullptr,
537 0.0,
538 0.0,
539 nullptr);
540 file_but_enable_drag(but, sfile, file, path, preview_image, icon, scale);
541
542 if (file->asset) {
544 }
545 else {
548 }
549}
550
551static void file_draw_preview(const FileList *files,
552 const FileDirEntry *file,
553 const rcti *tile_draw_rect,
554 const float icon_aspect,
555 const ImBuf *imb,
556 const int icon,
557 FileLayout *layout,
558 const bool is_icon,
559 const bool dimmed,
560 const bool is_link,
561 float *r_scale)
562{
563 float fx, fy;
564 float dx, dy;
565 int xco, yco;
566 float ui_imbx, ui_imby;
567 float scaledx, scaledy;
568 float scale;
569 int ex, ey;
570 bool show_outline = !is_icon && (file->typeflag & (FILE_TYPE_IMAGE | FILE_TYPE_OBJECT_IO |
572 const bool is_offline = (file->attributes & FILE_ATTR_OFFLINE);
573 const bool is_loading = filelist_file_is_preview_pending(files, file);
574
575 BLI_assert(imb != nullptr);
576
577 ui_imbx = imb->x * UI_SCALE_FAC;
578 ui_imby = imb->y * UI_SCALE_FAC;
579 /* Unlike thumbnails, icons are not scaled up. */
580 if (((ui_imbx > layout->prv_w) || (ui_imby > layout->prv_h)) ||
581 (!is_icon && ((ui_imbx < layout->prv_w) || (ui_imby < layout->prv_h))))
582 {
583 if (imb->x > imb->y) {
584 scaledx = float(layout->prv_w);
585 scaledy = (float(imb->y) / float(imb->x)) * layout->prv_w;
586 scale = scaledx / imb->x;
587 }
588 else {
589 scaledy = float(layout->prv_h);
590 scaledx = (float(imb->x) / float(imb->y)) * layout->prv_h;
591 scale = scaledy / imb->y;
592 }
593 }
594 else {
595 scaledx = ui_imbx;
596 scaledy = ui_imby;
597 scale = UI_SCALE_FAC;
598 }
599
600 ex = int(scaledx);
601 ey = int(scaledy);
602 fx = (float(layout->prv_w) - float(ex)) / 2.0f;
603 fy = (float(layout->prv_h) - float(ey)) / 2.0f;
604 dx = (fx + 0.5f + layout->prv_border_x);
605 dy = (fy + 0.5f - layout->prv_border_y);
606 xco = tile_draw_rect->xmin + int(dx);
607 yco = tile_draw_rect->ymax - layout->prv_h + int(dy);
608
610
611 /* the large image */
612
613 float document_img_col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
614 if (is_icon) {
615 if (file->typeflag & FILE_TYPE_DIR) {
616 UI_GetThemeColor4fv(TH_ICON_FOLDER, document_img_col);
617 }
618 else {
619 UI_GetThemeColor4fv(TH_TEXT, document_img_col);
620 }
621 }
622 else if (file->typeflag & FILE_TYPE_FTFONT) {
623 UI_GetThemeColor4fv(TH_TEXT, document_img_col);
624 }
625
626 if (dimmed) {
627 document_img_col[3] *= 0.3f;
628 }
629
630 if (!is_icon && ELEM(file->typeflag, FILE_TYPE_IMAGE, FILE_TYPE_OBJECT_IO)) {
631 /* Draw checker pattern behind image previews in case they have transparency. */
632 imm_draw_box_checker_2d(float(xco), float(yco), float(xco + ex), float(yco + ey));
633 }
634
635 if (!is_icon && file->typeflag & FILE_TYPE_BLENDERLIB) {
636 /* Datablock preview images use premultiplied alpha. */
638 }
639
640 if (!is_loading) {
641 /* Don't show outer document image if loading - too flashy. */
642 if (is_icon) {
643 /* Draw large folder or document icon. */
644 const int icon_large = (file->typeflag & FILE_TYPE_DIR) ? ICON_FILE_FOLDER_LARGE :
645 ICON_FILE_LARGE;
646 uchar icon_col[4];
647 rgba_float_to_uchar(icon_col, document_img_col);
648 float icon_x = float(xco) + (file->typeflag & FILE_TYPE_DIR ? 0.0f : ex * -0.142f);
649 float icon_y = float(yco) + (file->typeflag & FILE_TYPE_DIR ? ex * -0.11f : 0.0f);
650 UI_icon_draw_ex(icon_x,
651 icon_y,
652 icon_large,
653 icon_aspect / 4.0f / UI_SCALE_FAC,
654 document_img_col[3],
655 0.0f,
656 icon_col,
657 false,
659 }
660 else {
663 float(xco),
664 float(yco),
665 imb->x,
666 imb->y,
667 GPU_RGBA8,
668 true,
669 imb->byte_buffer.data,
670 scale,
671 scale,
672 1.0f,
673 1.0f,
674 document_img_col);
675 }
676 }
677
678 if (icon && is_icon) {
679 /* Small icon in the middle of large image, scaled to fit container and UI scale */
680 float icon_x, icon_y;
681 float icon_opacity = 0.4f;
682 uchar icon_color[4] = {0, 0, 0, 255};
683 if (rgb_to_grayscale(document_img_col) < 0.5f) {
684 icon_color[0] = 255;
685 icon_color[1] = 255;
686 icon_color[2] = 255;
687 }
688
689 if (is_loading) {
690 /* Contrast with background since we are not showing the large document image. */
691 UI_GetThemeColor4ubv(TH_TEXT, icon_color);
692 }
693
694 icon_x = xco + (file->typeflag & FILE_TYPE_DIR ? ex * 0.31f : ex * 0.178f);
695 icon_y = yco + (file->typeflag & FILE_TYPE_DIR ? ex * 0.19f : ex * 0.15f);
696 UI_icon_draw_ex(icon_x,
697 icon_y,
698 is_loading ? ICON_TEMP : icon,
699 icon_aspect / UI_SCALE_FAC / (file->typeflag & FILE_TYPE_DIR ? 1.5f : 2.0f),
700 icon_opacity,
701 0.0f,
702 icon_color,
703 false,
705 }
706
707 if (icon_aspect < 2.0f) {
708 const float icon_x = float(tile_draw_rect->xmin) + (3.0f * UI_SCALE_FAC);
709 const float icon_y = float(tile_draw_rect->ymin) + (17.0f * UI_SCALE_FAC);
710 const uchar light[4] = {255, 255, 255, 255};
711 if (is_offline) {
712 /* Icon at bottom to indicate the file is offline. */
713 UI_icon_draw_ex(icon_x,
714 icon_y,
715 ICON_INTERNET,
716 1.0f / UI_SCALE_FAC,
717 0.6f,
718 0.0f,
719 light,
720 true,
722 }
723 else if (is_link) {
724 /* Icon at bottom to indicate it is a shortcut, link, or alias. */
725 UI_icon_draw_ex(icon_x,
726 icon_y,
727 ICON_FILE_ALIAS,
728 1.0f / UI_SCALE_FAC,
729 0.6f,
730 0.0f,
731 nullptr,
732 false,
734 }
735 else if (icon && ((!is_icon && !(file->typeflag & FILE_TYPE_FTFONT)) || is_loading)) {
736 /* Smaller, fainter icon at bottom-left for preview image thumbnail, but not for fonts. */
737 UI_icon_draw_ex(icon_x,
738 icon_y,
739 icon,
740 1.0f / UI_SCALE_FAC,
741 0.6f,
742 0.0f,
743 light,
744 true,
746 }
747 }
748
749 const bool is_current_main_data = filelist_file_get_id(file) != nullptr;
750 if (is_current_main_data) {
751 /* Smaller, fainter icon at the top-right indicating that the file represents data from the
752 * current file (from current #Main in fact). */
753 float icon_x, icon_y;
754 const uchar light[4] = {255, 255, 255, 255};
755 icon_x = float(tile_draw_rect->xmax) - (16.0f * UI_SCALE_FAC);
756 icon_y = float(tile_draw_rect->ymax) - (20.0f * UI_SCALE_FAC);
757 UI_icon_draw_ex(icon_x,
758 icon_y,
759 ICON_CURRENT_FILE,
760 1.0f / UI_SCALE_FAC,
761 0.6f,
762 0.0f,
763 light,
764 true,
766 }
767
768 /* Contrasting outline around some preview types. */
769 if (show_outline) {
771
775 float border_color[4] = {1.0f, 1.0f, 1.0f, 0.15f};
776 float bgcolor[4];
778 if (rgb_to_grayscale(bgcolor) > 0.5f) {
779 border_color[0] = 0.0f;
780 border_color[1] = 0.0f;
781 border_color[2] = 0.0f;
782 }
783 immUniformColor4fv(border_color);
784 imm_draw_box_wire_2d(pos, float(xco), float(yco), float(xco + ex + 1), float(yco + ey + 1));
786 }
787
789
790 if (r_scale) {
791 *r_scale = scale;
792 }
793}
794
795static void renamebutton_cb(bContext *C, void * /*arg1*/, char *oldname)
796{
797 char newname[FILE_MAX + 12];
798 char orgname[FILE_MAX + 12];
799 char filename[FILE_MAX + 12];
801 wmWindow *win = CTX_wm_window(C);
803 ARegion *region = CTX_wm_region(C);
805
806 BLI_path_join(orgname, sizeof(orgname), params->dir, oldname);
807 STRNCPY(filename, params->renamefile);
809 BLI_path_join(newname, sizeof(newname), params->dir, filename);
810
811 if (!STREQ(orgname, newname)) {
812 errno = 0;
813 if ((BLI_rename(orgname, newname) != 0) || !BLI_exists(newname)) {
814 WM_reportf(RPT_ERROR, "Could not rename: %s", errno ? strerror(errno) : "unknown error");
815 WM_report_banner_show(wm, win);
816 /* Renaming failed, reset the name for further renaming handling. */
817 STRNCPY(params->renamefile, oldname);
818 }
819 else {
820 /* If rename is successful, set renamefile to newly renamed entry.
821 * This is used later to select and scroll to the file.
822 */
823 STRNCPY(params->renamefile, filename);
824 }
825
826 /* Ensure we select and scroll to the renamed file.
827 * This is done even if the rename fails as we want to make sure that the file we tried to
828 * rename is still selected and in view. (it can move if something added files/folders to the
829 * directory while we were renaming.
830 */
832 /* to make sure we show what is on disk */
833 ED_fileselect_clear(wm, sfile);
834 ED_region_tag_redraw(region);
835 }
836}
837
838static void draw_background(FileLayout *layout, View2D *v2d)
839{
840 const int item_height = layout->tile_h + (2 * layout->tile_border_y);
841 int i;
842 int sy;
843
846 float col_alternating[4];
847 UI_GetThemeColor4fv(TH_ROW_ALTERNATE, col_alternating);
849
850 /* alternating flat shade background */
851 for (i = 2; (i <= layout->rows + 1); i += 2) {
852 sy = int(v2d->cur.ymax) - layout->offset_top - i * item_height - layout->tile_border_y;
853
854 /* Offset pattern slightly to add scroll effect. */
855 sy += round_fl_to_int(item_height * (v2d->tot.ymax - v2d->cur.ymax) / item_height);
856
858 v2d->cur.xmin,
859 float(sy),
860 v2d->cur.xmax,
861 float(sy + layout->tile_h + 2 * layout->tile_border_y));
862 }
863
865}
866
867static void draw_dividers(FileLayout *layout, View2D *v2d)
868{
869 /* vertical column dividers */
870
871 const int step = (layout->tile_w + 2 * layout->tile_border_x);
872
873 uint vertex_len = 0;
874 int sx = int(v2d->tot.xmin);
875 while (sx < v2d->cur.xmax) {
876 sx += step;
877 vertex_len += 4; /* vertex_count = 2 points per line * 2 lines per divider */
878 }
879
880 if (vertex_len > 0) {
881 int v1[2], v2[2];
882 uchar col_hi[3], col_lo[3];
883
886
887 v1[1] = v2d->cur.ymax - layout->tile_border_y;
888 v2[1] = v2d->cur.ymin;
889
894
896 immBegin(GPU_PRIM_LINES, vertex_len);
897
898 sx = int(v2d->tot.xmin);
899 while (sx < v2d->cur.xmax) {
900 sx += step;
901
902 v1[0] = v2[0] = sx;
904 immVertex2iv(pos, v1);
905 immAttr3ubv(color, col_lo);
907
908 v1[0] = v2[0] = sx + 1;
910 immVertex2iv(pos, v1);
911 immAttr3ubv(color, col_hi);
913 }
914
915 immEnd();
917 }
918}
919
920static void draw_columnheader_background(const FileLayout *layout, const View2D *v2d)
921{
923
926
928 v2d->cur.xmin,
929 v2d->cur.ymax - layout->attribute_column_header_h,
930 v2d->cur.xmax,
931 v2d->cur.ymax);
932
934}
935
937 FileLayout *layout,
938 const View2D *v2d,
939 const uchar text_col[4])
940{
941 const float divider_pad = 0.2 * layout->attribute_column_header_h;
942 int sx = v2d->cur.xmin, sy = v2d->cur.ymax;
943
944 for (int column_type = 0; column_type < ATTRIBUTE_COLUMN_MAX; column_type++) {
946 {
947 continue;
948 }
949 const FileAttributeColumn *column = &layout->attribute_columns[column_type];
950
951 /* Active sort type triangle */
952 if (params->sort == column->sort_type) {
953 float tri_color[4];
954
955 rgba_uchar_to_float(tri_color, text_col);
956 UI_draw_icon_tri(sx + column->width - (0.3f * U.widget_unit) -
958 sy + (0.1f * U.widget_unit) - (layout->attribute_column_header_h / 2),
959 (params->flag & FILE_SORT_INVERT) ? 't' : 'v',
960 tri_color);
961 }
962
964 sy - layout->tile_border_y,
965 IFACE_(column->name),
966 column->width - 2 * ATTRIBUTE_COLUMN_PADDING,
969 text_col);
970
971 /* Separator line */
972 if (column_type != COLUMN_NAME) {
975
979 immVertex2f(pos, sx - 1, sy - divider_pad);
980 immVertex2f(pos, sx - 1, sy - layout->attribute_column_header_h + divider_pad);
981 immEnd();
983 }
984
985 sx += column->width;
986 }
987
988 /* Vertical separator lines line */
989 {
994 immVertex2f(pos, v2d->cur.xmin, sy);
995 immVertex2f(pos, v2d->cur.xmax, sy);
996 immVertex2f(pos, v2d->cur.xmin, sy - layout->attribute_column_header_h);
997 immVertex2f(pos, v2d->cur.xmax, sy - layout->attribute_column_header_h);
998 immEnd();
1000 }
1001}
1002
1008 /* Generated string will be cached in the file, so non-const. */
1009 FileDirEntry *file,
1010 const bool compact,
1011 const bool update_stat_strings)
1012{
1013 switch (column) {
1014 case COLUMN_DATETIME:
1015 if (!(file->typeflag & FILE_TYPE_BLENDERLIB) && !FILENAME_IS_CURRPAR(file->relpath)) {
1016 if (file->draw_data.datetime_str[0] == '\0' || update_stat_strings) {
1018 bool is_today, is_yesterday;
1019
1021 nullptr, file->time, compact, time, date, &is_today, &is_yesterday);
1022
1023 if (!compact && (is_today || is_yesterday)) {
1024 STRNCPY(date, is_today ? IFACE_("Today") : IFACE_("Yesterday"));
1025 }
1026 SNPRINTF(file->draw_data.datetime_str, compact ? "%s" : "%s %s", date, time);
1027 }
1028
1029 return file->draw_data.datetime_str;
1030 }
1031 break;
1032 case COLUMN_SIZE:
1035 {
1036 if (file->draw_data.size_str[0] == '\0' || update_stat_strings) {
1038 nullptr, file->size, compact, file->draw_data.size_str);
1039 }
1040
1041 return file->draw_data.size_str;
1042 }
1043 break;
1044 default:
1045 break;
1046 }
1047
1048 return nullptr;
1049}
1050
1052 const FileLayout *layout,
1053 FileDirEntry *file,
1054 const rcti *tile_draw_rect,
1055 const uchar text_col[4])
1056{
1057 const bool compact = FILE_LAYOUT_COMPACT(layout);
1058 const bool update_stat_strings = layout->width != layout->curr_size;
1059 int sx = tile_draw_rect->xmin - layout->tile_border_x - (UI_UNIT_X * 0.1f);
1060
1061 for (int column_type = 0; column_type < ATTRIBUTE_COLUMN_MAX; column_type++) {
1062 const FileAttributeColumn *column = &layout->attribute_columns[column_type];
1063
1064 /* Name column is not a detail column (should already be drawn), always skip here. */
1065 if (column_type == COLUMN_NAME) {
1066 sx += column->width;
1067 continue;
1068 }
1070 {
1071 continue;
1072 }
1073
1075 FileAttributeColumnType(column_type), file, compact, update_stat_strings);
1076
1077 if (str) {
1079 tile_draw_rect->ymax - layout->tile_border_y,
1080 IFACE_(str),
1081 column->width - 2 * ATTRIBUTE_COLUMN_PADDING,
1082 layout->tile_h,
1084 text_col);
1085 }
1086
1087 sx += column->width;
1088 }
1089}
1090
1092 const FileLayout *layout,
1093 const eFileDisplayType display,
1094 const int file_idx,
1095 const int padx)
1096{
1097 int tile_pos_x, tile_pos_y;
1098 ED_fileselect_layout_tilepos(layout, file_idx, &tile_pos_x, &tile_pos_y);
1099 tile_pos_x += int(v2d->tot.xmin);
1100 tile_pos_y = int(v2d->tot.ymax - tile_pos_y);
1101
1102 rcti rect;
1103 rect.xmin = tile_pos_x + padx;
1104 rect.xmax = rect.xmin + (ELEM(display, FILE_VERTICALDISPLAY, FILE_HORIZONTALDISPLAY) ?
1105 layout->tile_w - (2 * padx) :
1106 layout->tile_w);
1107 rect.ymax = tile_pos_y;
1108 rect.ymin = rect.ymax - layout->tile_h - layout->tile_border_y;
1109
1110 return rect;
1111}
1112
1113void file_draw_list(const bContext *C, ARegion *region)
1114{
1116 wmWindow *win = CTX_wm_window(C);
1117 SpaceFile *sfile = CTX_wm_space_file(C);
1119 FileLayout *layout = ED_fileselect_get_layout(sfile, region);
1120 View2D *v2d = &region->v2d;
1121 FileList *files = sfile->files;
1122 FileDirEntry *file;
1123 uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS);
1124 int numfiles;
1125 int numfiles_layout;
1126 int offset;
1127 int column_width, textheight;
1128 int i;
1129 bool is_icon;
1130 eFontStyle_Align align;
1131 bool do_drag;
1132 uchar text_col[4];
1133 const bool draw_columnheader = (params->display == FILE_VERTICALDISPLAY);
1134 const float thumb_icon_aspect = std::min(64.0f / float(params->thumbnail_size), 4.0f);
1135
1136 numfiles = filelist_files_ensure(files);
1137
1138 if (params->display != FILE_IMGDISPLAY) {
1139 draw_background(layout, v2d);
1140 draw_dividers(layout, v2d);
1141 }
1142
1144 layout, int(region->v2d.cur.xmin), int(-region->v2d.cur.ymax));
1145 if (offset < 0) {
1146 offset = 0;
1147 }
1148
1149 numfiles_layout = ED_fileselect_layout_numfiles(layout, region);
1150
1151 /* adjust, so the next row is already drawn when scrolling */
1152 if (layout->flag & FILE_LAYOUT_HOR) {
1153 numfiles_layout += layout->rows;
1154 }
1155 else {
1156 numfiles_layout += layout->flow_columns;
1157 }
1158
1159 filelist_file_cache_slidingwindow_set(files, numfiles_layout);
1160
1161 column_width = (FILE_IMGDISPLAY == params->display) ?
1162 layout->tile_w :
1164 textheight = int(layout->textheight * 3.0 / 2.0 + 0.5);
1165
1167
1168 if (numfiles > 0) {
1169 const bool success = filelist_file_cache_block(
1170 files, min_ii(offset + (numfiles_layout / 2), numfiles - 1));
1171 BLI_assert(success);
1172 UNUSED_VARS_NDEBUG(success);
1173
1175
1176 /* Handle preview timer here,
1177 * since it's filelist_file_cache_block() and filelist_cache_previews_update()
1178 * which controls previews task. */
1179 {
1180 const bool previews_running = filelist_cache_previews_running(files) &&
1182 // printf("%s: preview task: %d\n", __func__, previews_running);
1183 if (previews_running && !sfile->previews_timer) {
1185 wm, win, NC_SPACE | ND_SPACE_FILE_PREVIEW, 0.01);
1186 }
1187 if (!previews_running && sfile->previews_timer) {
1188 /* Preview is not running, no need to keep generating update events! */
1189 // printf("%s: Inactive preview task, sleeping!\n", __func__);
1191 sfile->previews_timer = nullptr;
1192 }
1193 }
1194 }
1195
1197
1198 UI_GetThemeColor4ubv(TH_TEXT, text_col);
1199
1200 for (i = offset; (i < numfiles) && (i < offset + numfiles_layout); i++) {
1201 eDirEntry_SelectFlag file_selflag;
1202 const int padx = 0.1f * UI_UNIT_X;
1203 int icon_ofs = 0;
1204
1205 const rcti tile_draw_rect = tile_draw_rect_get(
1206 v2d, layout, eFileDisplayType(params->display), i, padx);
1207
1208 file = filelist_file(files, i);
1209 file_selflag = filelist_entry_select_get(sfile->files, file, CHECK_ALL);
1210
1211 char path[FILE_MAX_LIBEXTRA];
1212 filelist_file_get_full_path(files, file, path);
1213
1214 if (!(file_selflag & FILE_SEL_EDITING)) {
1215 if ((params->highlight_file == i) || (file_selflag & FILE_SEL_HIGHLIGHTED) ||
1216 (file_selflag & FILE_SEL_SELECTED))
1217 {
1218 int colorid = (file_selflag & FILE_SEL_SELECTED) ? TH_HILITE : TH_BACK;
1219 int shade = (params->highlight_file == i) || (file_selflag & FILE_SEL_HIGHLIGHTED) ? 35 :
1220 0;
1221 BLI_assert(i == 0 || !FILENAME_IS_CURRPAR(file->relpath));
1222
1223 rcti tile_bg_rect = tile_draw_rect;
1224 /* One pixel downwards, places it more in the center. */
1225 BLI_rcti_translate(&tile_bg_rect, 0, -U.pixelsize);
1226 draw_tile_background(&tile_bg_rect, colorid, shade);
1227 }
1228 }
1230
1231 /* don't drag parent or refresh items */
1232 do_drag = !FILENAME_IS_CURRPAR(file->relpath);
1233 const bool is_hidden = (file->attributes & FILE_ATTR_HIDDEN);
1234 const bool is_link = (file->attributes & FILE_ATTR_ANY_LINK);
1235
1236 if (FILE_IMGDISPLAY == params->display) {
1237 const int icon = filelist_geticon(files, i, false);
1238 is_icon = false;
1239 const ImBuf *imb = filelist_getimage(files, i);
1240 if (!imb) {
1241 imb = filelist_geticon_image(files, i);
1242 is_icon = true;
1243 }
1244
1245 float scale = 0;
1246 file_draw_preview(files,
1247 file,
1248 &tile_draw_rect,
1249 thumb_icon_aspect,
1250 imb,
1251 icon,
1252 layout,
1253 is_icon,
1254 is_hidden,
1255 is_link,
1256 /* Returns the scale which is needed below. */
1257 &scale);
1258 if (do_drag) {
1260 sfile, block, layout, file, path, &tile_draw_rect, imb, icon, scale);
1261 }
1262 }
1263 else {
1264 const int icon = filelist_geticon(files, i, true);
1265
1266 icon_ofs += ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X;
1267
1268 /* Add dummy draggable button covering the icon and the label. */
1269 if (do_drag) {
1270 const uiStyle *style = UI_style_get();
1271 const int str_width = UI_fontstyle_string_width(&style->widget, file->name);
1272 const int drag_width = std::min(str_width + icon_ofs,
1273 int(column_width - ATTRIBUTE_COLUMN_PADDING));
1274 if (drag_width > 0) {
1275 uiBut *drag_but = uiDefBut(block,
1277 0,
1278 "",
1279 tile_draw_rect.xmin,
1280 tile_draw_rect.ymin - 1,
1281 drag_width,
1282 layout->tile_h + layout->tile_border_y * 2,
1283 nullptr,
1284 0,
1285 0,
1286 nullptr);
1288 file_but_enable_drag(drag_but, sfile, file, path, nullptr, icon, UI_SCALE_FAC);
1291 file_tooltip_data_create(sfile, file),
1292 MEM_freeN);
1293 }
1294 }
1295
1296 /* Add this after the fake draggable button, so the icon button tooltip is displayed. */
1297 uiBut *icon_but = file_add_icon_but(sfile,
1298 block,
1299 path,
1300 file,
1301 &tile_draw_rect,
1302 icon,
1305 is_hidden);
1306 if (do_drag) {
1307 /* For some reason the dragging is unreliable for the icon button if we don't explicitly
1308 * enable dragging, even though the dummy drag button above covers the same area. */
1309 file_but_enable_drag(icon_but, sfile, file, path, nullptr, icon, UI_SCALE_FAC);
1310 }
1311 }
1312
1313 if (file_selflag & FILE_SEL_EDITING) {
1314 const short width = (params->display == FILE_IMGDISPLAY) ?
1315 column_width :
1318
1319 uiBut *but = uiDefBut(block,
1321 1,
1322 "",
1323 tile_draw_rect.xmin + icon_ofs,
1324 tile_draw_rect.ymin + layout->tile_border_y - 0.15f * UI_UNIT_X,
1325 width - icon_ofs,
1326 textheight,
1327 params->renamefile,
1328 1.0f,
1329 float(sizeof(params->renamefile)),
1330 "");
1332 UI_but_flag_enable(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
1334 if (false == UI_but_active_only(C, region, block, but)) {
1335 /* Note that this is the only place where we can also handle a cancelled renaming. */
1336
1337 file_params_rename_end(wm, win, sfile, file);
1338
1339 /* After the rename button is removed, we need to make sure the view is redrawn once more,
1340 * in case selection changed. Usually UI code would trigger that redraw, but the rename
1341 * operator may have been called from a different region.
1342 * Tagging regions for redrawing while drawing is rightfully prevented. However, this
1343 * active button removing basically introduces handling logic to drawing code. So a
1344 * notifier should be an acceptable workaround. */
1346
1347 file_selflag = filelist_entry_select_get(sfile->files, file, CHECK_ALL);
1348 }
1349 }
1350
1351 /* file_selflag might have been modified by branch above. */
1352 if ((file_selflag & FILE_SEL_EDITING) == 0) {
1353 const int txpos = (params->display == FILE_IMGDISPLAY) ? tile_draw_rect.xmin :
1354 tile_draw_rect.xmin + 1 + icon_ofs;
1355 const int typos = (params->display == FILE_IMGDISPLAY) ?
1356 tile_draw_rect.ymin + layout->tile_border_y + layout->textheight :
1357 tile_draw_rect.ymax - layout->tile_border_y;
1358 const int twidth = (params->display == FILE_IMGDISPLAY) ?
1359 column_width :
1360 column_width - 1 - icon_ofs - padx - layout->tile_border_x;
1361 file_draw_string(txpos, typos, file->name, float(twidth), textheight, align, text_col);
1362 }
1363
1364 if (params->display != FILE_IMGDISPLAY) {
1365 draw_details_columns(params, layout, file, &tile_draw_rect, text_col);
1366 }
1367 }
1368
1369 if (numfiles < 1) {
1370 const rcti tile_draw_rect = tile_draw_rect_get(
1371 v2d, layout, eFileDisplayType(params->display), 0, 0);
1372 const uiStyle *style = UI_style_get();
1373
1374 const bool is_filtered = params->filter_search[0] != '\0';
1375
1376 uchar text_col_mod[4];
1377 copy_v4_v4_uchar(text_col_mod, text_col);
1378 if (!is_filtered) {
1379 text_col_mod[3] /= 2;
1380 }
1381
1382 const char *message = [&]() {
1383 if (!filelist_is_ready(files)) {
1384 return IFACE_("Loading...");
1385 }
1386 if (is_filtered) {
1387 return IFACE_("No results match the search filter");
1388 }
1389 return IFACE_("No items");
1390 }();
1391
1393 tile_draw_rect.xmin + UI_UNIT_X,
1394 tile_draw_rect.ymax - UI_UNIT_Y,
1395 message,
1396 text_col_mod);
1397 }
1398
1400
1401 UI_block_end(C, block);
1402 UI_block_draw(C, block);
1403
1404 /* Draw last, on top of file list. */
1405 if (draw_columnheader) {
1406 draw_columnheader_background(layout, v2d);
1407 draw_columnheader_columns(params, layout, v2d, text_col);
1408 }
1409
1410 if (numfiles != -1) {
1411 /* Only save current size if there is something to show. */
1412 layout->curr_size = layout->width;
1413 }
1414}
1415
1417 const SpaceFile *sfile,
1418 ARegion *region,
1419 FileAssetSelectParams *asset_params)
1420{
1421 char library_ui_path[FILE_MAX_LIBEXTRA];
1422 file_path_to_ui_path(asset_params->base_params.dir, library_ui_path, sizeof(library_ui_path));
1423
1424 uchar text_col[4];
1425 UI_GetThemeColor4ubv(TH_TEXT, text_col);
1426
1427 const View2D *v2d = &region->v2d;
1428 const int pad = sfile->layout->tile_border_x;
1429 const int width = BLI_rctf_size_x(&v2d->tot) - (2 * pad);
1430 const int line_height = sfile->layout->textheight;
1431 int sx = v2d->tot.xmin + pad;
1432 /* For some reason no padding needed. */
1433 int sy = v2d->tot.ymax;
1434
1435 {
1436 const char *message = RPT_("Path to asset library does not exist:");
1437 file_draw_string_multiline(sx, sy, message, width, line_height, text_col, nullptr, &sy);
1438
1439 sy -= line_height;
1440 file_draw_string(sx, sy, library_ui_path, width, line_height, UI_STYLE_TEXT_LEFT, text_col);
1441 }
1442
1443 /* Separate a bit further. */
1444 sy -= line_height * 2.2f;
1445
1446 {
1447 UI_icon_draw(sx, sy - UI_UNIT_Y, ICON_INFO);
1448
1449 const char *suggestion = RPT_(
1450 "Asset Libraries are local directories that can contain .blend files with assets inside.\n"
1451 "Manage Asset Libraries from the File Paths section in Preferences");
1453 sx + UI_UNIT_X, sy, suggestion, width - UI_UNIT_X, line_height, text_col, nullptr, &sy);
1454
1455 uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS);
1456 wmOperatorType *ot = WM_operatortype_find("SCREEN_OT_userpref_show", false);
1457 uiBut *but = uiDefIconTextButO_ptr(block,
1459 ot,
1461 ICON_PREFERENCES,
1462 WM_operatortype_name(ot, nullptr),
1463 sx + UI_UNIT_X,
1464 sy - line_height - UI_UNIT_Y * 1.2f,
1465 UI_UNIT_X * 8,
1466 UI_UNIT_Y,
1467 nullptr);
1468 PointerRNA *but_opptr = UI_but_operator_ptr_ensure(but);
1469 RNA_enum_set(but_opptr, "section", USER_SECTION_FILE_PATHS);
1470
1471 UI_block_end(C, block);
1472 UI_block_draw(C, block);
1473 }
1474}
1475
1477 const SpaceFile *sfile,
1478 ARegion *region,
1479 const char *blendfile_path,
1480 ReportList *reports)
1481{
1482 uchar text_col[4];
1483 UI_GetThemeColor4ubv(TH_TEXT, text_col);
1484
1485 const View2D *v2d = &region->v2d;
1486 const int pad = sfile->layout->tile_border_x;
1487 const int width = BLI_rctf_size_x(&v2d->tot) - (2 * pad);
1488 const int line_height = sfile->layout->textheight;
1489 int sx = v2d->tot.xmin + pad;
1490 /* For some reason no padding needed. */
1491 int sy = v2d->tot.ymax;
1492
1493 {
1494 const char *message = RPT_("Unreadable Blender library file:");
1495 file_draw_string_multiline(sx, sy, message, width, line_height, text_col, nullptr, &sy);
1496
1497 sy -= line_height;
1498 file_draw_string(sx, sy, blendfile_path, width, line_height, UI_STYLE_TEXT_LEFT, text_col);
1499 }
1500
1501 /* Separate a bit further. */
1502 sy -= line_height * 2.2f;
1503
1504 LISTBASE_FOREACH (Report *, report, &reports->list) {
1505 const short report_type = report->type;
1506 if (report_type <= RPT_INFO) {
1507 continue;
1508 }
1509
1510 int icon = ICON_INFO;
1511 if (report_type > RPT_WARNING) {
1512 icon = ICON_ERROR;
1513 }
1514 UI_icon_draw(sx, sy - UI_UNIT_Y, icon);
1515
1517 sy,
1518 RPT_(report->message),
1519 width - UI_UNIT_X,
1520 line_height,
1521 text_col,
1522 nullptr,
1523 &sy);
1524 sy -= line_height;
1525 }
1526}
1527
1528bool file_draw_hint_if_invalid(const bContext *C, const SpaceFile *sfile, ARegion *region)
1529{
1530 char blendfile_path[FILE_MAX_LIBEXTRA];
1531 const bool is_asset_browser = ED_fileselect_is_asset_browser(sfile);
1532 const bool is_library_browser = !is_asset_browser &&
1533 filelist_islibrary(sfile->files, blendfile_path, nullptr);
1534
1535 if (is_asset_browser) {
1537
1538 /* Check if the asset library exists. */
1539 if (!((asset_params->asset_library_ref.type == ASSET_LIBRARY_LOCAL) ||
1540 filelist_is_dir(sfile->files, asset_params->base_params.dir)))
1541 {
1542 file_draw_invalid_asset_library_hint(C, sfile, region, asset_params);
1543 return true;
1544 }
1545 }
1546
1547 /* Check if the blendfile library is valid (has entries). */
1548 if (is_library_browser) {
1549 if (!filelist_is_ready(sfile->files)) {
1550 return false;
1551 }
1552
1553 const int numfiles = filelist_files_num_entries(sfile->files);
1554 if (numfiles > 0) {
1555 return false;
1556 }
1557
1558 /* This could all be part of the file-list loading:
1559 * - When loading fails this could be saved in the file-list, e.g. when
1560 * `BLO_blendhandle_from_file()` returns null in `filelist_readjob_list_lib()`, a
1561 * `FL_HAS_INVALID_LIBRARY` file-list flag could be set.
1562 * - Reports from it could also be stored in `FileList` rather than being ignored
1563 * (`RPT_STORE` must be set!).
1564 * - Then we could just check for `is_library_browser` and the `FL_HAS_INVALID_LIBRARY` flag
1565 * here, and draw the hint with the reports in the file-list. (We would not draw a hint for
1566 * recursive loading, even if the file-list has the "has invalid library" flag set, which
1567 * seems like the wanted behavior.)
1568 * - The call to BKE_blendfile_is_readable() would not be needed then.
1569 */
1570 if (!sfile->runtime->is_blendfile_status_set) {
1573 blendfile_path, &sfile->runtime->is_blendfile_readable_reports);
1574 sfile->runtime->is_blendfile_status_set = true;
1575 }
1576 if (!sfile->runtime->is_blendfile_readable) {
1578 C, sfile, region, blendfile_path, &sfile->runtime->is_blendfile_readable_reports);
1579 return true;
1580 }
1581 }
1582
1583 return false;
1584}
Main runtime representation of an asset.
void immDrawPixelsTexTiled_scaling(IMMDrawPixelsTexState *state, float x, float y, int img_w, int img_h, eGPUTextureFormat gpu_format, bool use_filter, const void *rect, float scaleX, float scaleY, float xzoom, float yzoom, const float color[4])
Definition glutil.cc:301
IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
Definition glutil.cc:40
bool BKE_blendfile_is_readable(const char *path, ReportList *reports)
Definition blendfile.cc:152
SpaceFile * CTX_wm_space_file(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
SpaceLink * CTX_wm_space_data(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
void BKE_reports_clear(ReportList *reports)
Definition report.cc:81
@ BLF_WORD_WRAP
Definition BLF_api.hh:367
void BLF_batch_draw_begin()
Definition blf.cc:517
void BLF_boundbox(int fontid, const char *str, size_t str_len, rcti *r_box, ResultBLF *r_info=nullptr) ATTR_NONNULL(2)
Definition blf.cc:761
void BLF_disable(int fontid, int option)
Definition blf.cc:321
void BLF_batch_draw_end()
Definition blf.cc:530
void BLF_enable(int fontid, int option)
Definition blf.cc:312
void BLF_wordwrap(int fontid, int wrap_width)
Definition blf.cc:893
#define BLI_assert(a)
Definition BLI_assert.h:50
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition storage.cc:350
#define FILE_ATTR_ANY_LINK
void BLI_filelist_entry_size_to_string(const struct stat *st, uint64_t st_size_fallback, bool compact, char r_size[FILELIST_DIRENTRY_SIZE_LEN])
int BLI_rename(const char *from, const char *to) ATTR_NONNULL()
Definition fileops_c.cc:438
void BLI_filelist_entry_datetime_to_string(const struct stat *st, int64_t ts, bool compact, char r_time[FILELIST_DIRENTRY_TIME_LEN], char r_date[FILELIST_DIRENTRY_DATE_LEN], bool *r_is_today, bool *r_is_yesterday)
@ FILE_ATTR_HIDDEN
@ FILE_ATTR_READONLY
@ FILE_ATTR_RESTRICTED
@ FILE_ATTR_SYSTEM
@ FILE_ATTR_OFFLINE
Some types for dealing with directories.
#define FILELIST_DIRENTRY_DATE_LEN
#define FILELIST_DIRENTRY_TIME_LEN
#define LISTBASE_FOREACH(type, var, list)
MINLINE int round_fl_to_int(float a)
MINLINE int min_ii(int a, int b)
MINLINE float rgb_to_grayscale(const float rgb[3])
void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
void rgba_float_to_uchar(unsigned char r_col[4], const float col_f[4])
MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
#define FILE_MAXFILE
#define FILE_MAX
#define BLI_path_join(...)
#define FILENAME_IS_CURRPAR(_n)
void void BLI_path_split_dir_part(const char *filepath, char *dir, size_t dir_maxncpy) ATTR_NONNULL(1
bool BLI_path_make_safe_filename(char *filename) ATTR_NONNULL(1)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition BLI_rect.h:193
void BLI_rcti_pad(struct rcti *rect, int pad_x, int pad_y)
Definition rct.c:623
void BLI_rcti_translate(struct rcti *rect, int x, int y)
Definition rct.c:560
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition BLI_rect.h:189
void BLI_rctf_rcti_copy(struct rctf *dst, const struct rcti *src)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition BLI_rect.h:197
#define STRNCPY(dst, src)
Definition BLI_string.h:593
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:597
#define BLI_STR_FORMAT_UINT64_GROUPED_SIZE
Definition BLI_string.h:22
size_t BLI_str_format_uint64_grouped(char dst[BLI_STR_FORMAT_UINT64_GROUPED_SIZE], uint64_t num) ATTR_NONNULL(1)
Definition string.c:1180
unsigned char uchar
unsigned int uint
#define UNUSED_VARS_NDEBUG(...)
#define ELEM(...)
#define STREQ(a, b)
Compatibility-like things for windows.
external readfile function prototypes.
short BLO_version_from_file(const char *filepath)
Definition readfile.cc:1449
#define RPT_(msgid)
#define TIP_(msgid)
#define IFACE_(msgid)
@ ASSET_LIBRARY_LOCAL
@ FILE_TYPE_BLENDER
@ FILE_TYPE_ASSET
@ FILE_TYPE_BLENDER_BACKUP
@ FILE_TYPE_MOVIE
@ FILE_TYPE_OBJECT_IO
@ FILE_TYPE_FTFONT
@ FILE_TYPE_BLENDERLIB
@ FILE_TYPE_IMAGE
@ FILE_TYPE_DIR
@ FILE_BROWSE_MODE_ASSETS
eDirEntry_SelectFlag
@ FILE_SEL_EDITING
@ FILE_SEL_HIGHLIGHTED
@ FILE_SEL_SELECTED
eFileDisplayType
@ FILE_VERTICALDISPLAY
@ FILE_IMGDISPLAY
@ FILE_HORIZONTALDISPLAY
@ FILE_SORT_INVERT
#define FILE_MAX_LIBEXTRA
#define UI_SCALE_FAC
#define UI_ICON_SIZE
@ USER_SECTION_FILE_PATHS
#define FILE_LAYOUT_HOR
int ED_fileselect_layout_numfiles(FileLayout *layout, ARegion *region)
Definition filesel.cc:739
FileSelectParams * ED_fileselect_get_active_params(const SpaceFile *sfile)
Definition filesel.cc:380
int ED_fileselect_layout_offset(FileLayout *layout, int x, int y)
Definition filesel.cc:823
FileLayout * ED_fileselect_get_layout(SpaceFile *sfile, ARegion *region)
Definition filesel.cc:1140
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
FileAttributeColumnType
@ COLUMN_DATETIME
@ ATTRIBUTE_COLUMN_MAX
@ COLUMN_NAME
@ COLUMN_SIZE
void ED_fileselect_init_layout(SpaceFile *sfile, ARegion *region)
Definition filesel.cc:1035
void ED_fileselect_clear(wmWindowManager *wm, SpaceFile *sfile)
Definition filesel.cc:1289
void ED_fileselect_layout_tilepos(const FileLayout *layout, int tile, int *x, int *y)
Definition filesel.cc:874
int ED_fileselect_asset_import_method_get(const SpaceFile *sfile, const FileDirEntry *file)
Definition filesel.cc:512
void ED_region_tag_redraw(ARegion *region)
Definition area.cc:634
void immVertex2iv(uint attr_id, const int data[2])
void immAttr3ubv(uint attr_id, const unsigned char data[3])
void immEnd()
void immUnbindProgram()
void immAttrSkip(uint attr_id)
void immVertex2f(uint attr_id, float x, float y)
void immUniformThemeColorShade(int color_id, int offset)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
GPUVertFormat * immVertexFormat()
void immUniformColor4fv(const float rgba[4])
void immUniformThemeColorBlend(int color_id1, int color_id2, float fac)
void immBegin(GPUPrimType, uint vertex_len)
void imm_draw_box_wire_2d(uint pos, float x1, float y1, float x2, float y2)
void imm_draw_box_checker_2d(float x1, float y1, float x2, float y2)
void immRectf(uint pos, float x1, float y1, float x2, float y2)
@ GPU_PRIM_LINES
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_SHADER_3D_FLAT_COLOR
@ GPU_SHADER_3D_IMAGE_COLOR
@ GPU_BLEND_NONE
Definition GPU_state.hh:85
@ GPU_BLEND_ALPHA
Definition GPU_state.hh:87
@ GPU_BLEND_ALPHA_PREMULT
Definition GPU_state.hh:88
void GPU_blend(eGPUBlend blend)
Definition gpu_state.cc:42
@ GPU_FETCH_FLOAT
@ GPU_FETCH_INT_TO_FLOAT_UNIT
@ GPU_FETCH_INT_TO_FLOAT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_F32
@ GPU_COMP_I32
@ GPU_COMP_U8
Contains defines and structs used throughout the imbuf module.
bool IMB_metadata_get_field(const IDProperty *metadata, const char *key, char *value, size_t value_maxncpy)
Definition metadata.cc:42
ImBuf * IMB_thumb_read(const char *file_or_lib_path, ThumbSize size)
Definition thumbs.cc:499
@ THB_LARGE
Definition IMB_thumbs.hh:21
@ THB_SOURCE_IMAGE
Definition IMB_thumbs.hh:26
@ THB_SOURCE_MOVIE
Definition IMB_thumbs.hh:27
ImBuf * IMB_thumb_manage(const char *file_or_lib_path, ThumbSize size, ThumbSource source)
Definition thumbs.cc:533
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
#define C
Definition RandGen.cpp:29
void UI_but_flag_disable(uiBut *but, int flag)
#define UI_UNIT_Y
void UI_but_drag_attach_image(uiBut *but, const ImBuf *imb, float scale)
@ UI_EMBOSS
void UI_fontstyle_draw_simple(const uiFontStyle *fs, float x, float y, const char *str, const uchar col[4])
void UI_but_func_tooltip_custom_set(uiBut *but, uiButToolTipCustomFunc func, void *arg, uiFreeArgFunc free_arg)
void UI_draw_icon_tri(float x, float y, char dir, const float[4])
void UI_tooltip_image_field_add(uiTooltipData &data, const uiTooltipImage &image_data)
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *arg, uiFreeArgFunc free_arg)
uiBut * uiDefBut(uiBlock *block, int type, int retval, blender::StringRef str, int x, int y, short width, short height, void *poin, float min, float max, const char *tip)
void UI_tooltip_text_field_add(uiTooltipData &data, std::string text, std::string suffix, const uiTooltipStyle style, const uiTooltipColorID color_id, const bool is_pad=false)
bool UI_but_is_utf8(const uiBut *but)
uiBut * uiDefIconTextButO_ptr(uiBlock *block, int type, wmOperatorType *ot, wmOperatorCallContext opcontext, int icon, blender::StringRef str, int x, int y, short width, short height, const char *tip)
uiBut * uiDefIconBut(uiBlock *block, int type, int retval, int icon, int x, int y, short width, short height, void *poin, float min, float max, const char *tip)
void UI_but_drag_set_image(uiBut *but, const char *path, int icon, const ImBuf *imb, float scale)
uiBlock * UI_block_begin(const bContext *C, ARegion *region, std::string name, eUIEmbossType emboss)
void UI_draw_roundbox_corner_set(int type)
void UI_fontstyle_draw_ex(const uiFontStyle *fs, const rcti *rect, const char *str, size_t str_len, const uchar col[4], const uiFontStyleDraw_Params *fs_params, int *r_xofs, int *r_yofs, ResultBLF *r_info)
eFontStyle_Align
@ UI_STYLE_TEXT_LEFT
@ UI_STYLE_TEXT_CENTER
const uiStyle * UI_style_get()
void UI_but_dragflag_enable(uiBut *but, int flag)
void UI_but_drag_set_path(uiBut *but, const char *path)
@ UI_CNR_ALL
@ UI_CNR_NONE
@ UI_BUT_UNDO
@ UI_BUT_DISABLED
@ UI_BUT_NO_UTF8
PointerRNA * UI_but_operator_ptr_ensure(uiBut *but)
@ UI_TIP_STYLE_NORMAL
@ UI_TIP_STYLE_SPACER
@ UI_TIP_STYLE_HEADER
void UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2)
void UI_but_func_rename_set(uiBut *but, uiButHandleRenameFunc func, void *arg1)
void UI_block_draw(const bContext *C, uiBlock *block)
@ UI_BUT_DRAG_FULL_BUT
int UI_fontstyle_string_width(const uiFontStyle *fs, const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
float UI_text_clip_middle_ex(const uiFontStyle *fstyle, char *str, float okwidth, float minwidth, size_t max_len, char rpart_sep)
bool UI_but_active_only(const bContext *C, ARegion *region, uiBlock *block, uiBut *but)
void UI_fontstyle_draw(const uiFontStyle *fs, const rcti *rect, const char *str, size_t str_len, const uchar col[4], const uiFontStyleDraw_Params *fs_params)
void UI_but_label_alpha_factor_set(uiBut *but, float alpha_factor)
@ UI_TIP_LC_ALERT
@ UI_TIP_LC_MAIN
@ UI_TIP_LC_NORMAL
void UI_but_func_complete_set(uiBut *but, uiButCompleteFunc func, void *arg)
#define UI_UNIT_X
@ UI_BTYPE_BUT
@ UI_BTYPE_TEXT
@ UI_BTYPE_LABEL
void UI_but_drag_set_id(uiBut *but, ID *id)
void UI_draw_roundbox_aa(const rctf *rect, bool filled, float rad, const float color[4])
void UI_but_drag_set_asset(uiBut *but, const blender::asset_system::AssetRepresentation *asset, int import_method, int icon, const ImBuf *imb, float scale)
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_block_end(const bContext *C, uiBlock *block)
void UI_but_flag_enable(uiBut *but, int flag)
bool UI_but_flag_is_set(uiBut *but, int flag)
void UI_icon_draw(float x, float y, int icon_id)
#define ICON_DEFAULT_WIDTH_SCALE
#define UI_NO_ICON_OVERLAY_TEXT
#define ICON_DEFAULT_HEIGHT_SCALE
void UI_icon_draw_ex(float x, float y, int icon_id, float aspect, float alpha, float desaturate, const uchar mono_color[4], bool mono_border, const IconTextOverlay *text_overlay, const bool inverted=false)
@ TH_ROW_ALTERNATE
@ TH_ICON_FOLDER
@ TH_BACK
@ TH_HILITE
@ TH_TEXT
void UI_GetThemeColor4fv(int colorid, float col[4])
void UI_GetThemeColorShade4fv(int colorid, int offset, float col[4])
void UI_GetThemeColorShade3ubv(int colorid, int offset, unsigned char col[3])
void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
void UI_view2d_totRect_set(View2D *v2d, int width, int height)
Definition view2d.cc:1032
#define ND_SPACE_FILE_PREVIEW
Definition WM_types.hh:506
@ WM_OP_INVOKE_DEFAULT
Definition WM_types.hh:218
#define ND_SPACE_FILE_PARAMS
Definition WM_types.hh:489
#define NC_SPACE
Definition WM_types.hh:359
int pad[32 - sizeof(int)]
#define U
ATTR_WARN_UNUSED_RESULT const BMVert * v2
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
int len
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
RAYTRACE_GROUP_SIZE additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_global_ubo", "eevee_sampling_data", "eevee_utility_texture", "eevee_hiz_data", "draw_view") .specialization_constant(Type RAYTRACE_GROUP_SIZE in_sh_0_tx in_sh_2_tx screen_normal_tx GPU_RGBA8
#define str(s)
static void file_add_preview_drag_but(const SpaceFile *sfile, uiBlock *block, FileLayout *layout, const FileDirEntry *file, const char *path, const rcti *tile_draw_rect, const ImBuf *preview_image, const int icon, const float scale)
Definition file_draw.cc:512
static void draw_dividers(FileLayout *layout, View2D *v2d)
Definition file_draw.cc:867
static void draw_details_columns(const FileSelectParams *params, const FileLayout *layout, FileDirEntry *file, const rcti *tile_draw_rect, const uchar text_col[4])
void file_calc_previews(const bContext *C, ARegion *region)
Definition file_draw.cc:503
static void file_draw_invalid_asset_library_hint(const bContext *C, const SpaceFile *sfile, ARegion *region, FileAssetSelectParams *asset_params)
static void draw_tile_background(const rcti *draw_rect, int colorid, int shade)
Definition file_draw.cc:341
static std::string file_draw_asset_tooltip_func(bContext *, void *argN, const char *)
Definition file_draw.cc:335
static void draw_columnheader_columns(const FileSelectParams *params, FileLayout *layout, const View2D *v2d, const uchar text_col[4])
Definition file_draw.cc:936
static FileTooltipData * file_tooltip_data_create(const SpaceFile *sfile, const FileDirEntry *file)
Definition file_draw.cc:123
static void file_draw_string_multiline(int sx, int sy, const char *string, int wrap_width, int line_height, const uchar text_col[4], int *r_sx, int *r_sy)
Definition file_draw.cc:454
bool file_draw_hint_if_invalid(const bContext *C, const SpaceFile *sfile, ARegion *region)
static void file_draw_preview(const FileList *files, const FileDirEntry *file, const rcti *tile_draw_rect, const float icon_aspect, const ImBuf *imb, const int icon, FileLayout *layout, const bool is_icon, const bool dimmed, const bool is_link, float *r_scale)
Definition file_draw.cc:551
static void file_draw_tooltip_custom_func(bContext &, uiTooltipData &tip, void *argN)
Definition file_draw.cc:131
static void draw_columnheader_background(const FileLayout *layout, const View2D *v2d)
Definition file_draw.cc:920
static void renamebutton_cb(bContext *C, void *, char *oldname)
Definition file_draw.cc:795
void ED_file_path_button(bScreen *screen, const SpaceFile *sfile, FileSelectParams *params, uiBlock *block)
Definition file_draw.cc:72
static const char * filelist_get_details_column_string(FileAttributeColumnType column, FileDirEntry *file, const bool compact, const bool update_stat_strings)
static void file_draw_string(int sx, int sy, const char *string, float width, int height, eFontStyle_Align align, const uchar col[4])
Definition file_draw.cc:414
static uiBut * file_add_icon_but(const SpaceFile *sfile, uiBlock *block, const char *, const FileDirEntry *file, const rcti *tile_draw_rect, int icon, int width, int height, bool dimmed)
Definition file_draw.cc:385
void file_draw_list(const bContext *C, ARegion *region)
static void file_draw_invalid_library_hint(const bContext *, const SpaceFile *sfile, ARegion *region, const char *blendfile_path, ReportList *reports)
static void file_but_enable_drag(uiBut *but, const SpaceFile *sfile, const FileDirEntry *file, const char *path, const ImBuf *preview_image, int icon, float scale)
Definition file_draw.cc:352
static rcti tile_draw_rect_get(const View2D *v2d, const FileLayout *layout, const eFileDisplayType display, const int file_idx, const int padx)
void file_path_to_ui_path(const char *path, char *r_path, int r_path_maxncpy)
Definition file_utils.cc:32
bool file_attribute_column_type_enabled(const FileSelectParams *params, FileAttributeColumnType column, const FileLayout *layout)
Definition filesel.cc:900
void file_params_rename_end(wmWindowManager *wm, wmWindow *win, SpaceFile *sfile, const FileDirEntry *rename_file)
Definition filesel.cc:1356
void file_params_invoke_rename_postscroll(wmWindowManager *wm, wmWindow *win, SpaceFile *sfile)
Definition filesel.cc:1343
int autocomplete_directory(bContext *C, char *str, void *arg_v)
Definition filesel.cc:1221
#define FILE_LAYOUT_COMPACT(_layout)
void file_directory_enter_handle(bContext *C, void *arg_unused, void *arg_but)
Definition file_ops.cc:2819
#define ATTRIBUTE_COLUMN_PADDING
void file_draw_check_cb(bContext *C, void *arg1, void *arg2)
Definition file_ops.cc:1760
int filelist_files_num_entries(FileList *filelist)
Definition filelist.cc:2025
ImBuf * filelist_getimage(FileList *filelist, const int index)
Definition filelist.cc:1204
bool filelist_islibrary(FileList *filelist, char *dir, char **r_group)
Definition filelist.cc:3037
BlendHandle * filelist_lib(FileList *filelist)
Definition filelist.cc:2020
bool filelist_file_is_preview_pending(const FileList *filelist, const FileDirEntry *file)
Definition filelist.cc:1160
bool filelist_cache_previews_running(FileList *filelist)
Definition filelist.cc:2729
bool filelist_file_cache_block(FileList *filelist, const int index)
Definition filelist.cc:2420
bool filelist_cache_previews_done(FileList *filelist)
Definition filelist.cc:2736
void filelist_file_get_full_path(const FileList *filelist, const FileDirEntry *file, char r_filepath[])
Definition filelist.cc:1146
int filelist_geticon(FileList *filelist, const int index, const bool is_main)
Definition filelist.cc:1367
ID * filelist_file_get_id(const FileDirEntry *file)
Definition filelist.cc:2325
bool filelist_cache_previews_update(FileList *filelist)
Definition filelist.cc:2671
ImBuf * filelist_file_getimage(const FileDirEntry *file)
Definition filelist.cc:1211
void filelist_file_cache_slidingwindow_set(FileList *filelist, size_t window_size)
Definition filelist.cc:2358
bool filelist_is_dir(const FileList *filelist, const char *path)
Definition filelist.cc:2080
int filelist_files_ensure(FileList *filelist)
Definition filelist.cc:2148
FileDirEntry * filelist_file(FileList *filelist, int index)
Definition filelist.cc:2265
bool filelist_is_ready(const FileList *filelist)
Definition filelist.cc:2133
ImBuf * filelist_geticon_image(FileList *filelist, const int index)
Definition filelist.cc:1244
eDirEntry_SelectFlag filelist_entry_select_get(FileList *filelist, FileDirEntry *entry, FileCheckType check)
Definition filelist.cc:2983
@ CHECK_ALL
Definition filelist.hh:39
uint col
void IMB_freeImBuf(ImBuf *)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
format
void *(* MEM_mallocN)(size_t len, const char *str)
Definition mallocn.cc:44
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
static ulong state[N]
std::string asset_tooltip(const asset_system::AssetRepresentation &asset, const bool include_name)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
static void draw_background()
AssetLibraryReference asset_library_ref
FileSelectParams base_params
char datetime_str[16+8]
AssetRepresentationHandle * asset
struct FileDirEntry::@107237304145142027150067164132016042137132303223 draw_data
const char * name
FileAttributeColumn attribute_columns[ATTRIBUTE_COLUMN_MAX]
int attribute_column_header_h
const FileDirEntry * file
Definition file_draw.cc:120
const SpaceFile * sfile
Definition file_draw.cc:119
Definition DNA_ID.h:413
ImBufByteBuffer byte_buffer
IDProperty * metadata
ReportList is_blendfile_readable_reports
struct FileLayout * layout
struct FileList * files
struct wmTimer * previews_timer
SpaceFile_Runtime * runtime
float xmax
float xmin
float ymax
float ymin
int ymin
int ymax
int xmin
int xmax
uiFontStyle widget
#define N_(msgid)
void WM_event_add_notifier_ex(wmWindowManager *wm, const wmWindow *win, uint type, void *reference)
void WM_reportf(eReportType type, const char *format,...)
void WM_report_banner_show(wmWindowManager *wm, wmWindow *win)
wmOperatorType * ot
Definition wm_files.cc:4125
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
wmTimer * WM_event_timer_add_notifier(wmWindowManager *wm, wmWindow *win, const uint type, const double time_step)
void WM_event_timer_remove_notifier(wmWindowManager *wm, wmWindow *win, wmTimer *timer)