Blender  V2.93
file_draw.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2008 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <errno.h>
25 #include <math.h>
26 #include <string.h>
27 
28 #include "BLI_alloca.h"
29 #include "BLI_blenlib.h"
30 #include "BLI_fileops_types.h"
31 #include "BLI_math.h"
32 #include "BLI_utildefines.h"
33 
34 #ifdef WIN32
35 # include "BLI_winstuff.h"
36 #endif
37 
38 #include "BIF_glutil.h"
39 
40 #include "BKE_context.h"
41 #include "BKE_main.h"
42 
43 #include "BLO_readfile.h"
44 
45 #include "BLT_translation.h"
46 
47 #include "BLF_api.h"
48 
49 #include "IMB_imbuf_types.h"
50 
51 #include "DNA_userdef_types.h"
53 
54 #include "RNA_access.h"
55 
56 #include "ED_fileselect.h"
57 #include "ED_screen.h"
58 
59 #include "UI_interface.h"
60 #include "UI_interface_icons.h"
61 #include "UI_resources.h"
62 #include "UI_view2d.h"
63 
64 #include "WM_api.h"
65 #include "WM_types.h"
66 
67 #include "GPU_immediate.h"
68 #include "GPU_immediate_util.h"
69 #include "GPU_state.h"
70 
71 #include "filelist.h"
72 
73 #include "file_intern.h" /* own include */
74 
76  const SpaceFile *sfile,
78  uiBlock *block)
79 {
80  PointerRNA params_rna_ptr;
81  uiBut *but;
82 
83  RNA_pointer_create(&screen->id, &RNA_FileSelectParams, params, &params_rna_ptr);
84 
85  /* callbacks for operator check functions */
87 
88  but = uiDefButR(block,
90  -1,
91  "",
92  0,
93  0,
94  UI_UNIT_X * 10,
95  UI_UNIT_Y,
96  &params_rna_ptr,
97  "directory",
98  0,
99  0.0f,
100  (float)FILE_MAX,
101  0.0f,
102  0.0f,
103  TIP_("File path"));
104 
106  BLI_assert(!UI_but_is_utf8(but));
107 
110 
111  /* TODO, directory editing is non-functional while a library is loaded
112  * until this is properly supported just disable it. */
113  if (sfile && sfile->files && filelist_lib(sfile->files)) {
115  }
116 
117  /* clear func */
118  UI_block_func_set(block, NULL, NULL, NULL);
119 }
120 
121 /* Dummy helper - we need dynamic tooltips here. */
122 static char *file_draw_tooltip_func(bContext *UNUSED(C), void *argN, const char *UNUSED(tip))
123 {
124  char *dyn_tooltip = argN;
125  return BLI_strdup(dyn_tooltip);
126 }
127 
128 static void draw_tile(int sx, int sy, int width, int height, int colorid, int shade)
129 {
130  float color[4];
131  UI_GetThemeColorShade4fv(colorid, shade, color);
134  &(const rctf){
135  .xmin = (float)sx,
136  .xmax = (float)(sx + width),
137  .ymin = (float)(sy - height),
138  .ymax = (float)sy,
139  },
140  true,
141  5.0f,
142  color);
143 }
144 
145 static void file_draw_icon(uiBlock *block,
146  const FileDirEntry *file,
147  const char *path,
148  int sx,
149  int sy,
150  int icon,
151  int width,
152  int height,
153  bool drag,
154  bool dimmed)
155 {
156  uiBut *but;
157  int x, y;
158 
159  x = sx;
160  y = sy - height;
161 
162  /* For uiDefIconBut(), if a1==1.0 then a2 is alpha 0.0 - 1.0 */
163  const float a1 = dimmed ? 1.0f : 0.0f;
164  const float a2 = dimmed ? 0.3f : 0.0f;
165  but = uiDefIconBut(
166  block, UI_BTYPE_LABEL, 0, icon, x, y, width, height, NULL, 0.0f, 0.0f, a1, a2, NULL);
168 
169  if (drag) {
170  /* TODO duplicated from file_draw_preview(). */
171  ID *id;
172 
173  if ((id = filelist_file_get_id(file))) {
174  UI_but_drag_set_id(but, id);
175  }
176  else if (file->typeflag & FILE_TYPE_ASSET) {
177  ImBuf *preview_image = filelist_file_getimage(file);
178  char blend_path[FILE_MAX_LIBEXTRA];
179  if (BLO_library_path_explode(path, blend_path, NULL, NULL)) {
181  file->name,
182  BLI_strdup(blend_path),
183  file->blentype,
184  icon,
185  preview_image,
186  UI_DPI_FAC);
187  }
188  }
189  else {
190  /* path is no more static, cannot give it directly to but... */
191  UI_but_drag_set_path(but, BLI_strdup(path), true);
192  }
193  }
194 }
195 
196 static void file_draw_string(int sx,
197  int sy,
198  const char *string,
199  float width,
200  int height,
201  eFontStyle_Align align,
202  const uchar col[4])
203 {
204  uiFontStyle fs;
205  rcti rect;
206  char fname[FILE_MAXFILE];
207 
208  if (string[0] == '\0' || width < 1) {
209  return;
210  }
211 
212  const uiStyle *style = UI_style_get();
213  fs = style->widgetlabel;
214 
215  BLI_strncpy(fname, string, FILE_MAXFILE);
216  UI_text_clip_middle_ex(&fs, fname, width, UI_DPI_ICON_SIZE, sizeof(fname), '\0');
217 
218  /* no text clipping needed, UI_fontstyle_draw does it but is a bit too strict
219  * (for buttons it works) */
220  rect.xmin = sx;
221  rect.xmax = sx + round_fl_to_int(width);
222  rect.ymin = sy - height;
223  rect.ymax = sy;
224 
225  UI_fontstyle_draw(&fs,
226  &rect,
227  fname,
228  col,
229  &(struct uiFontStyleDraw_Params){
230  .align = align,
231  });
232 }
233 
238 static void file_draw_string_multiline(int sx,
239  int sy,
240  const char *string,
241  int wrap_width,
242  int line_height,
243  const uchar text_col[4],
244  int *r_sx,
245  int *r_sy)
246 {
247  rcti rect;
248 
249  if (string[0] == '\0' || wrap_width < 1) {
250  return;
251  }
252 
253  const uiStyle *style = UI_style_get();
254  int font_id = style->widgetlabel.uifont_id;
255  int len = strlen(string);
256 
257  rctf textbox;
258  BLF_wordwrap(font_id, wrap_width);
259  BLF_enable(font_id, BLF_WORD_WRAP);
260  BLF_boundbox(font_id, string, len, &textbox);
261  BLF_disable(font_id, BLF_WORD_WRAP);
262 
263  /* no text clipping needed, UI_fontstyle_draw does it but is a bit too strict
264  * (for buttons it works) */
265  rect.xmin = sx;
266  rect.xmax = sx + wrap_width;
267  /* Need to increase the clipping rect by one more line, since the #UI_fontstyle_draw_ex() will
268  * actually start drawing at (ymax - line-height). */
269  rect.ymin = sy - round_fl_to_int(BLI_rctf_size_y(&textbox)) - line_height;
270  rect.ymax = sy;
271 
272  struct ResultBLF result;
274  &rect,
275  string,
276  text_col,
277  &(struct uiFontStyleDraw_Params){
278  .align = UI_STYLE_TEXT_LEFT,
279  .word_wrap = true,
280  },
281  len,
282  NULL,
283  NULL,
284  &result);
285  if (r_sx) {
286  *r_sx = result.width;
287  }
288  if (r_sy) {
289  *r_sy = rect.ymin + line_height;
290  }
291 }
292 
293 void file_calc_previews(const bContext *C, ARegion *region)
294 {
295  SpaceFile *sfile = CTX_wm_space_file(C);
296  View2D *v2d = &region->v2d;
297 
298  ED_fileselect_init_layout(sfile, region);
299  UI_view2d_totRect_set(v2d, sfile->layout->width, sfile->layout->height);
300 }
301 
302 static void file_draw_preview(uiBlock *block,
303  const FileDirEntry *file,
304  const char *path,
305  int sx,
306  int sy,
307  const float icon_aspect,
308  ImBuf *imb,
309  const int icon,
310  FileLayout *layout,
311  const bool is_icon,
312  const bool drag,
313  const bool dimmed,
314  const bool is_link)
315 {
316  uiBut *but;
317  float fx, fy;
318  float dx, dy;
319  int xco, yco;
320  float ui_imbx, ui_imby;
321  float scaledx, scaledy;
322  float scale;
323  int ex, ey;
324  bool show_outline = !is_icon &&
326 
327  BLI_assert(imb != NULL);
328 
329  ui_imbx = imb->x * UI_DPI_FAC;
330  ui_imby = imb->y * UI_DPI_FAC;
331  /* Unlike thumbnails, icons are not scaled up. */
332  if (((ui_imbx > layout->prv_w) || (ui_imby > layout->prv_h)) ||
333  (!is_icon && ((ui_imbx < layout->prv_w) || (ui_imby < layout->prv_h)))) {
334  if (imb->x > imb->y) {
335  scaledx = (float)layout->prv_w;
336  scaledy = ((float)imb->y / (float)imb->x) * layout->prv_w;
337  scale = scaledx / imb->x;
338  }
339  else {
340  scaledy = (float)layout->prv_h;
341  scaledx = ((float)imb->x / (float)imb->y) * layout->prv_h;
342  scale = scaledy / imb->y;
343  }
344  }
345  else {
346  scaledx = ui_imbx;
347  scaledy = ui_imby;
348  scale = UI_DPI_FAC;
349  }
350 
351  ex = (int)scaledx;
352  ey = (int)scaledy;
353  fx = ((float)layout->prv_w - (float)ex) / 2.0f;
354  fy = ((float)layout->prv_h - (float)ey) / 2.0f;
355  dx = (fx + 0.5f + layout->prv_border_x);
356  dy = (fy + 0.5f - layout->prv_border_y);
357  xco = sx + (int)dx;
358  yco = sy - layout->prv_h + (int)dy;
359 
361 
362  /* the large image */
363 
364  float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
365  if (is_icon) {
366  if (file->typeflag & FILE_TYPE_DIR) {
368  }
369  else {
371  }
372  }
373  else if (file->typeflag & FILE_TYPE_FTFONT) {
375  }
376 
377  if (dimmed) {
378  col[3] *= 0.3f;
379  }
380 
381  if (!is_icon && file->typeflag & FILE_TYPE_BLENDERLIB) {
382  /* Datablock preview images use premultiplied alpha. */
384  }
385 
388  (float)xco,
389  (float)yco,
390  imb->x,
391  imb->y,
392  GPU_RGBA8,
393  false,
394  imb->rect,
395  scale,
396  scale,
397  1.0f,
398  1.0f,
399  col);
400 
402 
403  if (icon && is_icon) {
404  /* Small icon in the middle of large image, scaled to fit container and UI scale */
405  float icon_x, icon_y;
406  const float icon_size = 16.0f / icon_aspect * U.dpi_fac;
407  float icon_opacity = 0.3f;
408  uchar icon_color[4] = {0, 0, 0, 255};
409  float bgcolor[4];
411  if (rgb_to_grayscale(bgcolor) < 0.5f) {
412  icon_color[0] = 255;
413  icon_color[1] = 255;
414  icon_color[2] = 255;
415  }
416  icon_x = xco + (ex / 2.0f) - (icon_size / 2.0f);
417  icon_y = yco + (ey / 2.0f) - (icon_size * ((file->typeflag & FILE_TYPE_DIR) ? 0.78f : 0.75f));
419  icon_x, icon_y, icon, icon_aspect / U.dpi_fac, icon_opacity, 0.0f, icon_color, false);
420  }
421 
422  if (is_link) {
423  /* Arrow icon to indicate it is a shortcut, link, or alias. */
424  float icon_x, icon_y;
425  icon_x = xco + (2.0f * UI_DPI_FAC);
426  icon_y = yco + (2.0f * UI_DPI_FAC);
427  const int arrow = ICON_LOOP_FORWARDS;
428  if (!is_icon) {
429  /* Arrow at very bottom-left if preview style. */
430  const uchar dark[4] = {0, 0, 0, 255};
431  const uchar light[4] = {255, 255, 255, 255};
432  UI_icon_draw_ex(icon_x + 1, icon_y - 1, arrow, 1.0f / U.dpi_fac, 0.2f, 0.0f, dark, false);
433  UI_icon_draw_ex(icon_x, icon_y, arrow, 1.0f / U.dpi_fac, 0.6f, 0.0f, light, false);
434  }
435  else {
436  /* Link to folder or non-previewed file. */
437  uchar icon_color[4];
438  UI_GetThemeColor4ubv(TH_BACK, icon_color);
439  icon_x = xco + ((file->typeflag & FILE_TYPE_DIR) ? 0.14f : 0.23f) * scaledx;
440  icon_y = yco + ((file->typeflag & FILE_TYPE_DIR) ? 0.24f : 0.14f) * scaledy;
442  icon_x, icon_y, arrow, icon_aspect / U.dpi_fac * 1.8, 0.3f, 0.0f, icon_color, false);
443  }
444  }
445  else if (icon && !is_icon && !(file->typeflag & FILE_TYPE_FTFONT)) {
446  /* Smaller, fainter icon at bottom-left for preview image thumbnail, but not for fonts. */
447  float icon_x, icon_y;
448  const uchar dark[4] = {0, 0, 0, 255};
449  const uchar light[4] = {255, 255, 255, 255};
450  icon_x = xco + (2.0f * UI_DPI_FAC);
451  icon_y = yco + (2.0f * UI_DPI_FAC);
452  UI_icon_draw_ex(icon_x + 1, icon_y - 1, icon, 1.0f / U.dpi_fac, 0.2f, 0.0f, dark, false);
453  UI_icon_draw_ex(icon_x, icon_y, icon, 1.0f / U.dpi_fac, 0.6f, 0.0f, light, false);
454  }
455 
456  /* Contrasting outline around some preview types. */
457  if (show_outline) {
461  float border_color[4] = {1.0f, 1.0f, 1.0f, 0.4f};
462  float bgcolor[4];
463  UI_GetThemeColor4fv(TH_BACK, bgcolor);
464  if (rgb_to_grayscale(bgcolor) > 0.5f) {
465  border_color[0] = 0.0f;
466  border_color[1] = 0.0f;
467  border_color[2] = 0.0f;
468  }
469  immUniformColor4fv(border_color);
470  imm_draw_box_wire_2d(pos, (float)xco, (float)yco, (float)(xco + ex), (float)(yco + ey));
472  }
473 
474  but = uiDefBut(block, UI_BTYPE_LABEL, 0, "", xco, yco, ex, ey, NULL, 0.0, 0.0, 0, 0, NULL);
475 
476  /* Drag-region. */
477  if (drag) {
478  ID *id;
479 
480  if ((id = filelist_file_get_id(file))) {
481  UI_but_drag_set_id(but, id);
482  }
483  /* path is no more static, cannot give it directly to but... */
484  else if (file->typeflag & FILE_TYPE_ASSET) {
485  char blend_path[FILE_MAX_LIBEXTRA];
486  if (BLO_library_path_explode(path, blend_path, NULL, NULL)) {
488  but, file->name, BLI_strdup(blend_path), file->blentype, icon, imb, scale);
489  }
490  }
491  else {
492  UI_but_drag_set_image(but, BLI_strdup(path), icon, imb, scale, true);
493  }
494  }
495 
497 }
498 
499 static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
500 {
501  char newname[FILE_MAX + 12];
502  char orgname[FILE_MAX + 12];
503  char filename[FILE_MAX + 12];
505  SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C);
506  ARegion *region = CTX_wm_region(C);
508 
509  BLI_join_dirfile(orgname, sizeof(orgname), params->dir, oldname);
510  BLI_strncpy(filename, params->renamefile, sizeof(filename));
511  BLI_filename_make_safe(filename);
512  BLI_join_dirfile(newname, sizeof(newname), params->dir, filename);
513 
514  if (!STREQ(orgname, newname)) {
515  if (!BLI_exists(newname)) {
516  errno = 0;
517  if ((BLI_rename(orgname, newname) != 0) || !BLI_exists(newname)) {
518  WM_reportf(RPT_ERROR, "Could not rename: %s", errno ? strerror(errno) : "unknown error");
520  }
521  else {
522  /* If rename is successful, scroll to newly renamed entry. */
523  BLI_strncpy(params->renamefile, filename, sizeof(params->renamefile));
525 
526  if (sfile->smoothscroll_timer != NULL) {
528  }
529  sfile->smoothscroll_timer = WM_event_add_timer(wm, CTX_wm_window(C), TIMER1, 1.0 / 1000.0);
530  sfile->scroll_offset = 0;
531  }
532 
533  /* to make sure we show what is on disk */
534  ED_fileselect_clear(wm, CTX_data_scene(C), sfile);
535  }
536 
537  ED_region_tag_redraw(region);
538  }
539 }
540 
541 static void draw_background(FileLayout *layout, View2D *v2d)
542 {
543  const int item_height = layout->tile_h + (2 * layout->tile_border_y);
544  int i;
545  int sy;
546 
549  float col_alternating[4];
550  UI_GetThemeColor4fv(TH_ROW_ALTERNATE, col_alternating);
551  immUniformThemeColorBlend(TH_BACK, TH_ROW_ALTERNATE, col_alternating[3]);
552 
553  /* alternating flat shade background */
554  for (i = 2; (i <= layout->rows + 1); i += 2) {
555  sy = (int)v2d->cur.ymax - layout->offset_top - i * item_height - layout->tile_border_y;
556 
557  /* Offset pattern slightly to add scroll effect. */
558  sy += round_fl_to_int(item_height * (v2d->tot.ymax - v2d->cur.ymax) / item_height);
559 
560  immRectf(pos,
561  v2d->cur.xmin,
562  (float)sy,
563  v2d->cur.xmax,
564  (float)(sy + layout->tile_h + 2 * layout->tile_border_y));
565  }
566 
568 }
569 
570 static void draw_dividers(FileLayout *layout, View2D *v2d)
571 {
572  /* vertical column dividers */
573 
574  const int step = (layout->tile_w + 2 * layout->tile_border_x);
575 
576  uint vertex_len = 0;
577  int sx = (int)v2d->tot.xmin;
578  while (sx < v2d->cur.xmax) {
579  sx += step;
580  vertex_len += 4; /* vertex_count = 2 points per line * 2 lines per divider */
581  }
582 
583  if (vertex_len > 0) {
584  int v1[2], v2[2];
585  uchar col_hi[3], col_lo[3];
586 
587  UI_GetThemeColorShade3ubv(TH_BACK, 30, col_hi);
588  UI_GetThemeColorShade3ubv(TH_BACK, -30, col_lo);
589 
590  v1[1] = v2d->cur.ymax - layout->tile_border_y;
591  v2[1] = v2d->cur.ymin;
592 
597 
599  immBegin(GPU_PRIM_LINES, vertex_len);
600 
601  sx = (int)v2d->tot.xmin;
602  while (sx < v2d->cur.xmax) {
603  sx += step;
604 
605  v1[0] = v2[0] = sx;
606  immAttrSkip(color);
607  immVertex2iv(pos, v1);
608  immAttr3ubv(color, col_lo);
609  immVertex2iv(pos, v2);
610 
611  v1[0] = v2[0] = sx + 1;
612  immAttrSkip(color);
613  immVertex2iv(pos, v1);
614  immAttr3ubv(color, col_hi);
615  immVertex2iv(pos, v2);
616  }
617 
618  immEnd();
620  }
621 }
622 
623 static void draw_columnheader_background(const FileLayout *layout, const View2D *v2d)
624 {
626 
629 
630  immRectf(pos,
631  v2d->cur.xmin,
632  v2d->cur.ymax - layout->attribute_column_header_h,
633  v2d->cur.xmax,
634  v2d->cur.ymax);
635 
637 }
638 
640  FileLayout *layout,
641  const View2D *v2d,
642  const uchar text_col[4])
643 {
644  const float divider_pad = 0.2 * layout->attribute_column_header_h;
645  int sx = v2d->cur.xmin, sy = v2d->cur.ymax;
646 
647  for (FileAttributeColumnType column_type = 0; column_type < ATTRIBUTE_COLUMN_MAX;
648  column_type++) {
649  if (!file_attribute_column_type_enabled(params, column_type)) {
650  continue;
651  }
652  const FileAttributeColumn *column = &layout->attribute_columns[column_type];
653 
654  /* Active sort type triangle */
655  if (params->sort == column->sort_type) {
656  float tri_color[4];
657 
658  rgba_uchar_to_float(tri_color, text_col);
659  UI_draw_icon_tri(sx + column->width - (0.3f * U.widget_unit) -
661  sy + (0.1f * U.widget_unit) - (layout->attribute_column_header_h / 2),
662  (params->flag & FILE_SORT_INVERT) ? 't' : 'v',
663  tri_color);
664  }
665 
667  sy - layout->tile_border_y,
668  IFACE_(column->name),
669  column->width - 2 * ATTRIBUTE_COLUMN_PADDING,
670  layout->attribute_column_header_h - layout->tile_border_y,
672  text_col);
673 
674  /* Separator line */
675  if (column_type != COLUMN_NAME) {
678 
682  immVertex2f(pos, sx - 1, sy - divider_pad);
683  immVertex2f(pos, sx - 1, sy - layout->attribute_column_header_h + divider_pad);
684  immEnd();
686  }
687 
688  sx += column->width;
689  }
690 
691  /* Vertical separator lines line */
692  {
697  immVertex2f(pos, v2d->cur.xmin, sy);
698  immVertex2f(pos, v2d->cur.xmax, sy);
699  immVertex2f(pos, v2d->cur.xmin, sy - layout->attribute_column_header_h);
700  immVertex2f(pos, v2d->cur.xmax, sy - layout->attribute_column_header_h);
701  immEnd();
703  }
704 }
705 
710  const FileDirEntry *file,
711  const bool small_size,
712  const bool update_stat_strings)
713 {
714  switch (column) {
715  case COLUMN_DATETIME:
716  if (!(file->typeflag & FILE_TYPE_BLENDERLIB) && !FILENAME_IS_CURRPAR(file->relpath)) {
717  if ((file->entry->datetime_str[0] == '\0') || update_stat_strings) {
719  bool is_today, is_yesterday;
720 
722  NULL, file->entry->time, small_size, time, date, &is_today, &is_yesterday);
723 
724  if (is_today || is_yesterday) {
725  BLI_strncpy(date, is_today ? N_("Today") : N_("Yesterday"), sizeof(date));
726  }
727  BLI_snprintf(
728  file->entry->datetime_str, sizeof(file->entry->datetime_str), "%s %s", date, time);
729  }
730 
731  return file->entry->datetime_str;
732  }
733  break;
734  case COLUMN_SIZE:
735  if ((file->typeflag & (FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) ||
736  !(file->typeflag & (FILE_TYPE_DIR | FILE_TYPE_BLENDERLIB))) {
737  if ((file->entry->size_str[0] == '\0') || update_stat_strings) {
739  NULL, file->entry->size, small_size, file->entry->size_str);
740  }
741 
742  return file->entry->size_str;
743  }
744  break;
745  default:
746  break;
747  }
748 
749  return NULL;
750 }
751 
753  const FileLayout *layout,
754  const FileDirEntry *file,
755  const int pos_x,
756  const int pos_y,
757  const uchar text_col[4])
758 {
759  const bool small_size = SMALL_SIZE_CHECK(params->thumbnail_size);
760  const bool update_stat_strings = small_size != SMALL_SIZE_CHECK(layout->curr_size);
761  int sx = pos_x - layout->tile_border_x - (UI_UNIT_X * 0.1f), sy = pos_y;
762 
763  for (FileAttributeColumnType column_type = 0; column_type < ATTRIBUTE_COLUMN_MAX;
764  column_type++) {
765  const FileAttributeColumn *column = &layout->attribute_columns[column_type];
766 
767  /* Name column is not a detail column (should already be drawn), always skip here. */
768  if (column_type == COLUMN_NAME) {
769  sx += column->width;
770  continue;
771  }
772  if (!file_attribute_column_type_enabled(params, column_type)) {
773  continue;
774  }
775 
777  column_type, file, small_size, update_stat_strings);
778 
779  if (str) {
781  sy - layout->tile_border_y,
782  IFACE_(str),
783  column->width - 2 * ATTRIBUTE_COLUMN_PADDING,
784  layout->tile_h,
785  column->text_align,
786  text_col);
787  }
788 
789  sx += column->width;
790  }
791 }
792 
793 void file_draw_list(const bContext *C, ARegion *region)
794 {
795  SpaceFile *sfile = CTX_wm_space_file(C);
797  FileLayout *layout = ED_fileselect_get_layout(sfile, region);
798  View2D *v2d = &region->v2d;
799  struct FileList *files = sfile->files;
800  struct FileDirEntry *file;
801  const char *root = filelist_dir(files);
802  ImBuf *imb;
803  uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS);
804  int numfiles;
805  int numfiles_layout;
806  int sx, sy;
807  int offset;
808  int textwidth, textheight;
809  int i;
810  bool is_icon;
811  eFontStyle_Align align;
812  bool do_drag;
813  uchar text_col[4];
814  const bool draw_columnheader = (params->display == FILE_VERTICALDISPLAY);
815  const float thumb_icon_aspect = MIN2(64.0f / (float)(params->thumbnail_size), 1.0f);
816 
817  numfiles = filelist_files_ensure(files);
818 
819  if (params->display != FILE_IMGDISPLAY) {
820  draw_background(layout, v2d);
821  draw_dividers(layout, v2d);
822  }
823 
825  layout, (int)region->v2d.cur.xmin, (int)-region->v2d.cur.ymax);
826  if (offset < 0) {
827  offset = 0;
828  }
829 
830  numfiles_layout = ED_fileselect_layout_numfiles(layout, region);
831 
832  /* adjust, so the next row is already drawn when scrolling */
833  if (layout->flag & FILE_LAYOUT_HOR) {
834  numfiles_layout += layout->rows;
835  }
836  else {
837  numfiles_layout += layout->flow_columns;
838  }
839 
840  filelist_file_cache_slidingwindow_set(files, numfiles_layout);
841 
842  textwidth = (FILE_IMGDISPLAY == params->display) ?
843  layout->tile_w :
845  textheight = (int)(layout->textheight * 3.0 / 2.0 + 0.5);
846 
848 
849  if (numfiles > 0) {
850  const bool success = filelist_file_cache_block(
851  files, min_ii(offset + (numfiles_layout / 2), numfiles - 1));
852  BLI_assert(success);
853  UNUSED_VARS_NDEBUG(success);
854 
856 
857  /* Handle preview timer here,
858  * since it's filelist_file_cache_block() and filelist_cache_previews_update()
859  * which controls previews task. */
860  {
861  const bool previews_running = filelist_cache_previews_running(files);
862  // printf("%s: preview task: %d\n", __func__, previews_running);
863  if (previews_running && !sfile->previews_timer) {
866  }
867  if (!previews_running && sfile->previews_timer) {
868  /* Preview is not running, no need to keep generating update events! */
869  // printf("%s: Inactive preview task, sleeping!\n", __func__);
871  sfile->previews_timer = NULL;
872  }
873  }
874  }
875 
877 
878  UI_GetThemeColor4ubv(TH_TEXT, text_col);
879 
880  for (i = offset; (i < numfiles) && (i < offset + numfiles_layout); i++) {
881  uint file_selflag;
882  char path[FILE_MAX_LIBEXTRA];
883  int padx = 0.1f * UI_UNIT_X;
884  int icon_ofs = 0;
885 
886  ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
887  sx += (int)(v2d->tot.xmin + padx);
888  sy = (int)(v2d->tot.ymax - sy);
889 
890  file = filelist_file(files, i);
891  file_selflag = filelist_entry_select_get(sfile->files, file, CHECK_ALL);
892 
893  BLI_join_dirfile(path, sizeof(path), root, file->relpath);
894 
895  if (!(file_selflag & FILE_SEL_EDITING)) {
896  if ((params->highlight_file == i) || (file_selflag & FILE_SEL_HIGHLIGHTED) ||
897  (file_selflag & FILE_SEL_SELECTED)) {
898  int colorid = (file_selflag & FILE_SEL_SELECTED) ? TH_HILITE : TH_BACK;
899  int shade = (params->highlight_file == i) || (file_selflag & FILE_SEL_HIGHLIGHTED) ? 35 :
900  0;
901  const short width = ELEM(params->display, FILE_VERTICALDISPLAY, FILE_HORIZONTALDISPLAY) ?
902  layout->tile_w - (2 * padx) :
903  layout->tile_w;
904 
905  BLI_assert(i == 0 || !FILENAME_IS_CURRPAR(file->relpath));
906 
907  draw_tile(
908  sx, sy - 1, width, sfile->layout->tile_h + layout->tile_border_y, colorid, shade);
909  }
910  }
912 
913  /* don't drag parent or refresh items */
914  do_drag = !(FILENAME_IS_CURRPAR(file->relpath));
915  const bool is_hidden = (file->attributes & FILE_ATTR_HIDDEN);
916  const bool is_link = (file->attributes & FILE_ATTR_ANY_LINK);
917 
918  if (FILE_IMGDISPLAY == params->display) {
919  const int icon = filelist_geticon(files, i, false);
920  is_icon = 0;
921  imb = filelist_getimage(files, i);
922  if (!imb) {
923  imb = filelist_geticon_image(files, i);
924  is_icon = 1;
925  }
926 
927  file_draw_preview(block,
928  file,
929  path,
930  sx,
931  sy,
932  thumb_icon_aspect,
933  imb,
934  icon,
935  layout,
936  is_icon,
937  do_drag,
938  is_hidden,
939  is_link);
940  }
941  else {
942  file_draw_icon(block,
943  file,
944  path,
945  sx,
946  sy - layout->tile_border_y,
947  filelist_geticon(files, i, true),
950  do_drag,
951  is_hidden);
952  icon_ofs += ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X;
953  }
954 
955  if (file_selflag & FILE_SEL_EDITING) {
956  const short width = (params->display == FILE_IMGDISPLAY) ?
957  textwidth :
960 
961  uiBut *but = uiDefBut(block,
963  1,
964  "",
965  sx + icon_ofs,
966  sy - layout->tile_h - 0.15f * UI_UNIT_X,
967  width - icon_ofs,
968  textheight,
969  params->renamefile,
970  1.0f,
971  (float)sizeof(params->renamefile),
972  0,
973  0,
974  "");
976  UI_but_flag_enable(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
978  if (false == UI_but_active_only(C, region, block, but)) {
979  file_selflag = filelist_entry_select_set(
981  }
982  }
983 
984  /* file_selflag might have been modified by branch above. */
985  if ((file_selflag & FILE_SEL_EDITING) == 0) {
986  const int txpos = (params->display == FILE_IMGDISPLAY) ? sx : sx + 1 + icon_ofs;
987  const int typos = (params->display == FILE_IMGDISPLAY) ?
988  sy - layout->tile_h + layout->textheight :
989  sy - layout->tile_border_y;
990  const int twidth = (params->display == FILE_IMGDISPLAY) ?
991  textwidth :
992  textwidth - 1 - icon_ofs - padx - layout->tile_border_x;
993  file_draw_string(txpos, typos, file->name, (float)twidth, textheight, align, text_col);
994  }
995 
996  if (params->display != FILE_IMGDISPLAY) {
997  draw_details_columns(params, layout, file, sx, sy, text_col);
998  }
999  }
1000 
1002 
1003  UI_block_end(C, block);
1004  UI_block_draw(C, block);
1005 
1006  /* Draw last, on top of file list. */
1007  if (draw_columnheader) {
1008  draw_columnheader_background(layout, v2d);
1009  draw_columnheader_columns(params, layout, v2d, text_col);
1010  }
1011 
1012  layout->curr_size = params->thumbnail_size;
1013 }
1014 
1015 static void file_draw_invalid_library_hint(const SpaceFile *sfile, const ARegion *region)
1016 {
1017  const FileAssetSelectParams *asset_params = ED_fileselect_get_asset_params(sfile);
1018 
1019  char library_ui_path[PATH_MAX];
1020  file_path_to_ui_path(asset_params->base_params.dir, library_ui_path, sizeof(library_ui_path));
1021 
1022  uchar text_col[4];
1023  uchar text_alert_col[4];
1024  UI_GetThemeColor4ubv(TH_TEXT, text_col);
1025  UI_GetThemeColor4ubv(TH_REDALERT, text_alert_col);
1026 
1027  const View2D *v2d = &region->v2d;
1028  const int pad = sfile->layout->tile_border_x;
1029  const int width = BLI_rctf_size_x(&v2d->tot) - (2 * pad);
1030  const int line_height = sfile->layout->textheight;
1031  int sx = v2d->tot.xmin + pad;
1032  /* For some reason no padding needed. */
1033  int sy = v2d->tot.ymax;
1034 
1035  {
1036  const char *message = TIP_("Library not found");
1037  const int draw_string_str_len = strlen(message) + 2 + sizeof(library_ui_path);
1038  char *draw_string = alloca(draw_string_str_len);
1039  BLI_snprintf(draw_string, draw_string_str_len, "%s: %s", message, library_ui_path);
1040  file_draw_string_multiline(sx, sy, draw_string, width, line_height, text_alert_col, NULL, &sy);
1041  }
1042 
1043  /* Next line, but separate it a bit further. */
1044  sy -= line_height;
1045 
1046  {
1047  UI_icon_draw(sx, sy - UI_UNIT_Y, ICON_INFO);
1048 
1049  const char *suggestion = TIP_(
1050  "Set up the library or edit libraries in the Preferences, File Paths section");
1052  sx + UI_UNIT_X, sy, suggestion, width - UI_UNIT_X, line_height, text_col, NULL, NULL);
1053  }
1054 }
1055 
1060 bool file_draw_hint_if_invalid(const SpaceFile *sfile, const ARegion *region)
1061 {
1063  /* Only for asset browser. */
1064  if (!ED_fileselect_is_asset_browser(sfile)) {
1065  return false;
1066  }
1067  /* Check if the library exists. */
1068  if ((asset_params->asset_library.type == FILE_ASSET_LIBRARY_LOCAL) ||
1069  filelist_is_dir(sfile->files, asset_params->base_params.dir)) {
1070  return false;
1071  }
1072 
1073  file_draw_invalid_library_hint(sfile, region);
1074 
1075  return true;
1076 }
typedef float(TangentPoint)[2]
void immDrawPixelsTexScaled(IMMDrawPixelsTexState *state, float x, float y, int img_w, int img_h, eGPUTextureFormat gpu_format, bool use_filter, void *rect, float scaleX, float scaleY, float xzoom, float yzoom, const float color[4])
Definition: glutil.c:265
IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
Definition: glutil.c:66
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1034
struct wmWindowManager * CTX_wm_manager(const bContext *C)
Definition: context.c:689
struct SpaceLink * CTX_wm_space_data(const bContext *C)
Definition: context.c:719
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:725
struct SpaceFile * CTX_wm_space_file(const bContext *C)
Definition: context.c:818
struct wmWindow * CTX_wm_window(const bContext *C)
Definition: context.c:699
void BLF_disable(int fontid, int option)
Definition: blf.c:283
void BLF_batch_draw_begin(void)
Definition: blf.c:470
void BLF_enable(int fontid, int option)
Definition: blf.c:274
#define BLF_WORD_WRAP
Definition: BLF_api.h:275
void BLF_batch_draw_end(void)
Definition: blf.c:483
void BLF_wordwrap(int fontid, int wrap_width)
Definition: blf.c:822
void BLF_boundbox(int fontid, const char *str, size_t len, struct rctf *box) ATTR_NONNULL()
Definition: blf.c:693
#define BLI_assert(a)
Definition: BLI_assert.h:58
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: storage.c:349
#define FILE_ATTR_ANY_LINK
Definition: BLI_fileops.h:99
int BLI_rename(const char *from, const char *to) ATTR_NONNULL()
Definition: fileops.c:1381
@ FILE_ATTR_HIDDEN
Definition: BLI_fileops.h:82
void BLI_filelist_entry_size_to_string(const struct stat *st, const uint64_t sz, const bool compact, char r_size[])
#define PATH_MAX
Definition: BLI_fileops.h:44
void BLI_filelist_entry_datetime_to_string(const struct stat *st, const int64_t ts, const bool compact, char r_time[], char r_date[], bool *r_is_today, bool *r_is_yesterday)
Some types for dealing with directories.
#define FILELIST_DIRENTRY_DATE_LEN
#define FILELIST_DIRENTRY_TIME_LEN
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])
Definition: math_color.c:414
#define FILE_MAXFILE
#define FILE_MAX
void BLI_join_dirfile(char *__restrict dst, const size_t maxlen, const char *__restrict dir, const char *__restrict file) ATTR_NONNULL()
Definition: path_util.c:1737
#define FILENAME_IS_CURRPAR(_n)
bool BLI_filename_make_safe(char *fname) ATTR_NONNULL(1)
Definition: path_util.c:299
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition: BLI_rect.h:161
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition: BLI_rect.h:165
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
Definition: string.c:70
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
unsigned char uchar
Definition: BLI_sys_types.h:86
unsigned int uint
Definition: BLI_sys_types.h:83
#define UNUSED_VARS_NDEBUG(...)
#define UNUSED(x)
#define ELEM(...)
#define MIN2(a, b)
#define STREQ(a, b)
Compatibility-like things for windows.
external readfile function prototypes.
bool BLO_library_path_explode(const char *path, char *r_dir, char **r_group, char **r_name)
Definition: readfile.c:1701
#define TIP_(msgid)
#define IFACE_(msgid)
#define N_(msgid)
@ FILE_TYPE_BLENDER
@ FILE_TYPE_ASSET
@ FILE_TYPE_BLENDER_BACKUP
@ FILE_TYPE_MOVIE
@ FILE_TYPE_FTFONT
@ FILE_TYPE_BLENDERLIB
@ FILE_TYPE_IMAGE
@ FILE_TYPE_DIR
@ FILE_PARAMS_RENAME_POSTSCROLL_PENDING
@ FILE_SEL_EDITING
@ FILE_SEL_HIGHLIGHTED
@ FILE_SEL_SELECTED
@ FILE_VERTICALDISPLAY
@ FILE_IMGDISPLAY
@ FILE_HORIZONTALDISPLAY
@ FILE_ASSET_LIBRARY_LOCAL
@ FILE_SORT_INVERT
#define FILE_MAX_LIBEXTRA
struct FileAssetSelectParams * ED_fileselect_get_asset_params(const struct SpaceFile *sfile)
#define FILE_LAYOUT_HOR
Definition: ED_fileselect.h:44
int ED_fileselect_layout_offset(FileLayout *layout, int x, int y)
Definition: filesel.c:717
bool ED_fileselect_is_asset_browser(const struct SpaceFile *sfile)
void ED_fileselect_layout_tilepos(FileLayout *layout, int tile, int *x, int *y)
Definition: filesel.c:772
int ED_fileselect_layout_numfiles(FileLayout *layout, struct ARegion *region)
Definition: filesel.c:634
struct FileSelectParams * ED_fileselect_get_active_params(const struct SpaceFile *sfile)
FileAttributeColumnType
Definition: ED_fileselect.h:47
@ COLUMN_DATETIME
Definition: ED_fileselect.h:50
@ ATTRIBUTE_COLUMN_MAX
Definition: ED_fileselect.h:53
@ COLUMN_NAME
Definition: ED_fileselect.h:49
@ COLUMN_SIZE
Definition: ED_fileselect.h:51
void ED_fileselect_clear(struct wmWindowManager *wm, struct Scene *owner_scene, struct SpaceFile *sfile)
Definition: filesel.c:1185
void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *region)
Definition: filesel.c:940
FileLayout * ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *region)
Definition: filesel.c:1037
void ED_region_tag_redraw(struct ARegion *region)
Definition: area.c:667
void immVertex2iv(uint attr_id, const int data[2])
void immAttr3ubv(uint attr_id, const unsigned char data[3])
void immAttrSkip(uint attr_id)
void immUnbindProgram(void)
void immVertex2f(uint attr_id, float x, float y)
void immUniformThemeColorShade(int color_id, int offset)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
void immUniformColor4fv(const float rgba[4])
void immUniformThemeColorBlend(int color_id1, int color_id2, float fac)
GPUVertFormat * immVertexFormat(void)
void immBegin(GPUPrimType, uint vertex_len)
void immEnd(void)
void imm_draw_box_wire_2d(uint pos, float x1, float y1, float x2, float y2)
void immRectf(uint pos, float x1, float y1, float x2, float y2)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
@ GPU_PRIM_LINES
Definition: GPU_primitive.h:36
@ GPU_SHADER_2D_UNIFORM_COLOR
Definition: GPU_shader.h:171
@ GPU_SHADER_2D_IMAGE_COLOR
Definition: GPU_shader.h:187
@ GPU_SHADER_2D_FLAT_COLOR
Definition: GPU_shader.h:178
@ GPU_BLEND_NONE
Definition: GPU_state.h:55
@ GPU_BLEND_ALPHA
Definition: GPU_state.h:57
@ GPU_BLEND_ALPHA_PREMULT
Definition: GPU_state.h:58
void GPU_blend(eGPUBlend blend)
Definition: gpu_state.cc:55
@ GPU_RGBA8
Definition: GPU_texture.h:88
@ 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.
StructRNA RNA_FileSelectParams
#define C
Definition: RandGen.cpp:39
void UI_but_flag_disable(uiBut *but, int flag)
Definition: interface.c:6082
#define UI_UNIT_Y
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *argN)
Definition: interface.c:6323
@ UI_EMBOSS
Definition: UI_interface.h:107
uiBut * uiDefIconBut(uiBlock *block, int type, int retval, int icon, int x, int y, short width, short height, void *poin, float min, float max, float a1, float a2, const char *tip)
Definition: interface.c:5223
void UI_fontstyle_draw_ex(const struct uiFontStyle *fs, const struct rcti *rect, const char *str, const uchar col[4], const struct uiFontStyleDraw_Params *fs_params, size_t len, int *r_xofs, int *r_yofs, struct ResultBLF *r_info)
@ UI_BUT_UNDO
Definition: UI_interface.h:208
@ UI_BUT_DISABLED
Definition: UI_interface.h:199
@ UI_BUT_NO_UTF8
Definition: UI_interface.h:210
void UI_draw_icon_tri(float x, float y, char dir, const float[4])
@ UI_CNR_ALL
@ UI_CNR_NONE
uiBut * uiDefBut(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, void *poin, float min, float max, float a1, float a2, const char *tip)
Definition: interface.c:4687
const struct uiStyle * UI_style_get(void)
void UI_but_drag_set_image(uiBut *but, const char *path, int icon, struct ImBuf *imb, float scale, const bool use_free)
Definition: interface.c:6201
bool UI_but_is_utf8(const uiBut *but)
void UI_but_drag_set_path(uiBut *but, const char *path, const bool use_free)
Definition: interface.c:6172
void UI_draw_roundbox_corner_set(int type)
void UI_but_drag_set_id(uiBut *but, struct ID *id)
Definition: interface.c:6127
eFontStyle_Align
@ UI_STYLE_TEXT_LEFT
@ UI_STYLE_TEXT_CENTER
void UI_block_end(const struct bContext *C, uiBlock *block)
uiBut * uiDefButR(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
Definition: interface.c:5144
#define UI_DPI_ICON_SIZE
Definition: UI_interface.h:311
void UI_block_draw(const struct bContext *C, struct uiBlock *block)
void UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2)
Definition: interface.c:6259
bool UI_but_active_only(const struct bContext *C, struct ARegion *region, uiBlock *block, uiBut *but)
void UI_but_func_rename_set(uiBut *but, uiButHandleRenameFunc func, void *arg1)
Definition: interface.c:6277
#define UI_DPI_FAC
Definition: UI_interface.h:309
void UI_draw_roundbox_aa(const struct rctf *rect, bool filled, float rad, const float color[4])
uiBlock * UI_block_begin(const struct bContext *C, struct ARegion *region, const char *name, eUIEmbossType emboss)
float UI_text_clip_middle_ex(const struct uiFontStyle *fstyle, char *str, float okwidth, const float minwidth, const size_t max_len, const char rpart_sep)
void UI_fontstyle_draw(const struct uiFontStyle *fs, const struct rcti *rect, const char *str, const uchar col[4], const struct uiFontStyleDraw_Params *fs_params)
void UI_but_func_complete_set(uiBut *but, uiButCompleteFunc func, void *arg)
Definition: interface.c:6312
void UI_but_funcN_set(uiBut *but, uiButHandleNFunc funcN, void *argN, void *arg2)
Definition: interface.c:6301
void UI_but_drag_set_asset(uiBut *but, const char *name, const char *path, int id_type, int icon, struct ImBuf *imb, float scale)
Definition: interface.c:6137
#define UI_UNIT_X
@ UI_BTYPE_TEXT
Definition: UI_interface.h:336
@ UI_BTYPE_LABEL
Definition: UI_interface.h:358
void UI_but_flag_enable(uiBut *but, int flag)
Definition: interface.c:6077
bool UI_but_flag_is_set(uiBut *but, int flag)
Definition: interface.c:6087
void UI_icon_draw(float x, float y, int icon_id)
#define ICON_DEFAULT_WIDTH_SCALE
#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], const bool mono_border)
@ TH_ROW_ALTERNATE
Definition: UI_resources.h:278
@ TH_ICON_FOLDER
Definition: UI_resources.h:292
@ TH_BACK
Definition: UI_resources.h:55
@ TH_REDALERT
Definition: UI_resources.h:50
@ TH_HILITE
Definition: UI_resources.h:82
@ TH_TEXT
Definition: UI_resources.h:58
void UI_GetThemeColor4fv(int colorid, float col[4])
Definition: resources.c:1199
void UI_GetThemeColorShade4fv(int colorid, int offset, float col[4])
Definition: resources.c:1359
void UI_GetThemeColorShade3ubv(int colorid, int offset, unsigned char col[3])
Definition: resources.c:1235
void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
Definition: resources.c:1381
void UI_view2d_totRect_set(struct View2D *v2d, int width, int height)
Definition: view2d.c:1052
#define ND_SPACE_FILE_PREVIEW
Definition: WM_types.h:434
#define NC_SPACE
Definition: WM_types.h:293
ATTR_WARN_UNUSED_RESULT const BMVert * v2
unsigned int U
Definition: btGjkEpa3.h:78
FILE * file
double time
#define str(s)
static void draw_dividers(FileLayout *layout, View2D *v2d)
Definition: file_draw.c:570
bool file_draw_hint_if_invalid(const SpaceFile *sfile, const ARegion *region)
Definition: file_draw.c:1060
void file_calc_previews(const bContext *C, ARegion *region)
Definition: file_draw.c:293
static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
Definition: file_draw.c:499
static void file_draw_preview(uiBlock *block, const FileDirEntry *file, const char *path, int sx, int sy, const float icon_aspect, ImBuf *imb, const int icon, FileLayout *layout, const bool is_icon, const bool drag, const bool dimmed, const bool is_link)
Definition: file_draw.c:302
static void file_draw_icon(uiBlock *block, const FileDirEntry *file, const char *path, int sx, int sy, int icon, int width, int height, bool drag, bool dimmed)
Definition: file_draw.c:145
static void draw_columnheader_columns(const FileSelectParams *params, FileLayout *layout, const View2D *v2d, const uchar text_col[4])
Definition: file_draw.c:639
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.c:238
static char * file_draw_tooltip_func(bContext *UNUSED(C), void *argN, const char *UNUSED(tip))
Definition: file_draw.c:122
static void draw_details_columns(const FileSelectParams *params, const FileLayout *layout, const FileDirEntry *file, const int pos_x, const int pos_y, const uchar text_col[4])
Definition: file_draw.c:752
static const char * filelist_get_details_column_string(FileAttributeColumnType column, const FileDirEntry *file, const bool small_size, const bool update_stat_strings)
Definition: file_draw.c:709
static void draw_tile(int sx, int sy, int width, int height, int colorid, int shade)
Definition: file_draw.c:128
static void file_draw_invalid_library_hint(const SpaceFile *sfile, const ARegion *region)
Definition: file_draw.c:1015
static void draw_columnheader_background(const FileLayout *layout, const View2D *v2d)
Definition: file_draw.c:623
void ED_file_path_button(bScreen *screen, const SpaceFile *sfile, FileSelectParams *params, uiBlock *block)
Definition: file_draw.c:75
static void draw_background(FileLayout *layout, View2D *v2d)
Definition: file_draw.c:541
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.c:196
void file_draw_list(const bContext *C, ARegion *region)
Definition: file_draw.c:793
int autocomplete_directory(struct bContext *C, char *str, void *arg_v)
#define SMALL_SIZE_CHECK(_size)
Definition: file_intern.h:37
void file_directory_enter_handle(bContext *C, void *arg_unused, void *arg_but)
#define ATTRIBUTE_COLUMN_PADDING
Definition: file_intern.h:35
void file_path_to_ui_path(const char *path, char *r_pathi, int max_size)
Definition: file_utils.c:52
bool file_attribute_column_type_enabled(const FileSelectParams *params, FileAttributeColumnType column)
Definition: filesel.c:801
void file_draw_check_cb(bContext *C, void *arg1, void *arg2)
ImBuf * filelist_geticon_image(struct FileList *filelist, const int index)
Definition: filelist.c:1176
int filelist_geticon(struct FileList *filelist, const int index, const bool is_main)
Definition: filelist.c:1298
bool filelist_cache_previews_running(FileList *filelist)
Definition: filelist.c:2461
BlendHandle * filelist_lib(struct FileList *filelist)
Definition: filelist.c:1827
ID * filelist_file_get_id(const FileDirEntry *file)
Definition: filelist.c:2071
bool filelist_cache_previews_update(FileList *filelist)
Definition: filelist.c:2408
bool filelist_file_cache_block(struct FileList *filelist, const int index)
Definition: filelist.c:2172
void filelist_file_cache_slidingwindow_set(FileList *filelist, size_t window_size)
Definition: filelist.c:2103
uint filelist_entry_select_set(const FileList *filelist, const FileDirEntry *entry, FileSelType select, uint flag, FileCheckType check)
Definition: filelist.c:2608
FileDirEntry * filelist_file(struct FileList *filelist, int index)
Definition: filelist.c:2041
int filelist_files_ensure(FileList *filelist)
Definition: filelist.c:1931
ImBuf * filelist_getimage(struct FileList *filelist, const int index)
Definition: filelist.c:1145
ImBuf * filelist_file_getimage(const FileDirEntry *file)
Definition: filelist.c:1152
bool filelist_is_dir(struct FileList *filelist, const char *path)
Definition: filelist.c:1868
uint filelist_entry_select_get(FileList *filelist, FileDirEntry *entry, FileCheckType check)
Definition: filelist.c:2679
const char * filelist_dir(struct FileList *filelist)
Definition: filelist.c:1863
@ FILE_SEL_REMOVE
Definition: filelist.h:39
@ CHECK_ALL
Definition: filelist.h:47
uint pos
uint col
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
format
Definition: logImageCore.h:47
static ulong state[N]
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
Definition: rna_access.c:146
FileSelectAssetLibraryUID asset_library
FileSelectParams base_params
const char * name
Definition: ED_fileselect.h:58
int prv_border_x
Definition: ED_fileselect.h:79
int prv_border_y
Definition: ED_fileselect.h:80
FileAttributeColumn attribute_columns[ATTRIBUTE_COLUMN_MAX]
Definition: ED_fileselect.h:92
int attribute_column_header_h
Definition: ED_fileselect.h:72
short curr_size
Definition: ED_fileselect.h:95
int tile_border_y
Definition: ED_fileselect.h:78
int flow_columns
Definition: ED_fileselect.h:84
int tile_border_x
Definition: ED_fileselect.h:77
Definition: DNA_ID.h:273
unsigned int * rect
struct wmTimer * smoothscroll_timer
struct FileLayout * layout
struct FileList * files
struct wmTimer * previews_timer
float xmax
Definition: DNA_vec_types.h:85
float xmin
Definition: DNA_vec_types.h:85
float ymax
Definition: DNA_vec_types.h:86
float ymin
Definition: DNA_vec_types.h:86
int ymin
Definition: DNA_vec_types.h:80
int ymax
Definition: DNA_vec_types.h:80
int xmin
Definition: DNA_vec_types.h:79
int xmax
Definition: DNA_vec_types.h:79
uiFontStyle widget
uiFontStyle widgetlabel
int wrap_width(const struct SpaceText *st, struct ARegion *region)
uint len
void WM_report_banner_show(void)
void WM_reportf(ReportType type, const char *format,...)
@ TIMER1
void WM_event_remove_timer(wmWindowManager *wm, wmWindow *UNUSED(win), wmTimer *timer)
Definition: wm_window.c:1669
wmTimer * WM_event_add_timer_notifier(wmWindowManager *wm, wmWindow *win, unsigned int type, double timestep)
Definition: wm_window.c:1648
void WM_event_remove_timer_notifier(wmWindowManager *wm, wmWindow *win, wmTimer *timer)
Definition: wm_window.c:1703
wmTimer * WM_event_add_timer(wmWindowManager *wm, wmWindow *win, int event_type, double timestep)
Definition: wm_window.c:1632