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
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{
125 FileTooltipData *data = (FileTooltipData *)MEM_mallocN(sizeof(FileTooltipData), __func__);
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 }
176 if (file->attributes & (FILE_ATTR_SYSTEM | FILE_ATTR_RESTRICTED)) {
178 tip, N_("This is a restricted system file"), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_ALERT);
179 }
180
181 if (file->typeflag & (FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) {
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) {
404 UI_but_func_tooltip_set(but, file_draw_asset_tooltip_func, file->asset, nullptr);
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
503void file_calc_previews(const bContext *C, ARegion *region)
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) {
543 UI_but_func_tooltip_set(but, file_draw_asset_tooltip_func, file->asset, nullptr);
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;
903 immAttrSkip(color);
904 immVertex2iv(pos, v1);
905 immAttr3ubv(color, col_lo);
907
908 v1[0] = v2[0] = sx + 1;
909 immAttrSkip(color);
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:
1033 if ((file->typeflag & (FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) ||
1034 !(file->typeflag & (FILE_TYPE_DIR | FILE_TYPE_BLENDERLIB)))
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;
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
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
@ BLF_WORD_WRAP
Definition BLF_api.hh:367
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.
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)
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)
@ UI_BUT_DRAG_FULL_BUT
void UI_but_func_rename_set(uiBut *but, uiButHandleRenameFunc func, void *arg1)
void UI_block_draw(const bContext *C, uiBlock *block)
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_CNR_ALL
@ UI_CNR_NONE
@ 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)
@ UI_BUT_UNDO
@ UI_BUT_DISABLED
@ UI_BUT_NO_UTF8
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)]
ATTR_WARN_UNUSED_RESULT const BMVert * v2
unsigned int U
Definition btGjkEpa3.h:78
FILE * file
double time
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
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)