Blender  V3.3
file_draw.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2008 Blender Foundation. All rights reserved. */
3 
8 #include <errno.h>
9 #include <math.h>
10 #include <string.h>
11 
12 #include "MEM_guardedalloc.h"
13 
14 #include "BLI_alloca.h"
15 #include "BLI_blenlib.h"
16 #include "BLI_fileops_types.h"
17 #include "BLI_math.h"
18 #include "BLI_utildefines.h"
19 
20 #ifdef WIN32
21 # include "BLI_winstuff.h"
22 #endif
23 
24 #include "BIF_glutil.h"
25 
26 #include "BKE_blendfile.h"
27 #include "BKE_context.h"
28 #include "BKE_report.h"
29 
30 #include "BLO_readfile.h"
31 
32 #include "BLT_translation.h"
33 
34 #include "BLF_api.h"
35 
36 #include "IMB_imbuf_types.h"
37 
38 #include "DNA_userdef_types.h"
40 
41 #include "RNA_access.h"
42 #include "RNA_prototypes.h"
43 
44 #include "ED_fileselect.h"
45 #include "ED_screen.h"
46 
47 #include "UI_interface.h"
48 #include "UI_interface_icons.h"
49 #include "UI_resources.h"
50 #include "UI_view2d.h"
51 
52 #include "WM_api.h"
53 #include "WM_types.h"
54 
55 #include "GPU_immediate.h"
56 #include "GPU_immediate_util.h"
57 #include "GPU_state.h"
58 
59 #include "filelist.h"
60 
61 #include "file_intern.h" /* own include */
62 
64  const SpaceFile *sfile,
66  uiBlock *block)
67 {
68  PointerRNA params_rna_ptr;
69  uiBut *but;
70 
72  "File select parameters not set. The caller is expected to check this.");
73 
74  RNA_pointer_create(&screen->id, &RNA_FileSelectParams, params, &params_rna_ptr);
75 
76  /* callbacks for operator check functions */
78 
79  but = uiDefButR(block,
81  -1,
82  "",
83  0,
84  0,
85  UI_UNIT_X * 10,
86  UI_UNIT_Y,
87  &params_rna_ptr,
88  "directory",
89  0,
90  0.0f,
91  (float)FILE_MAX,
92  0.0f,
93  0.0f,
94  TIP_("File path"));
95 
98 
101 
102  /* TODO: directory editing is non-functional while a library is loaded
103  * until this is properly supported just disable it. */
104  if (sfile && sfile->files && filelist_lib(sfile->files)) {
106  }
107 
108  /* clear func */
109  UI_block_func_set(block, NULL, NULL, NULL);
110 }
111 
112 /* Dummy helper - we need dynamic tooltips here. */
113 static char *file_draw_tooltip_func(bContext *UNUSED(C), void *argN, const char *UNUSED(tip))
114 {
115  char *dyn_tooltip = argN;
116  return BLI_strdup(dyn_tooltip);
117 }
118 
119 static void draw_tile_background(const rcti *draw_rect, int colorid, int shade)
120 {
121  float color[4];
122  rctf draw_rect_fl;
123  BLI_rctf_rcti_copy(&draw_rect_fl, draw_rect);
124 
125  UI_GetThemeColorShade4fv(colorid, shade, color);
127  UI_draw_roundbox_aa(&draw_rect_fl, true, 5.0f, color);
128 }
129 
130 static void file_draw_icon(const SpaceFile *sfile,
131  uiBlock *block,
132  const FileDirEntry *file,
133  const char *path,
134  const rcti *tile_draw_rect,
135  int icon,
136  int width,
137  int height,
138  bool drag,
139  bool dimmed)
140 {
141  uiBut *but;
142 
143  const int x = tile_draw_rect->xmin;
144  const int y = tile_draw_rect->ymax - sfile->layout->tile_border_y - height;
145 
146  /* For uiDefIconBut(), if a1==1.0 then a2 is alpha 0.0 - 1.0 */
147  const float a1 = dimmed ? 1.0f : 0.0f;
148  const float a2 = dimmed ? 0.3f : 0.0f;
149  but = uiDefIconBut(
150  block, UI_BTYPE_LABEL, 0, icon, x, y, width, height, NULL, 0.0f, 0.0f, a1, a2, NULL);
152 
153  if (drag) {
154  /* TODO: duplicated from file_draw_preview(). */
155  ID *id;
156 
157  if ((id = filelist_file_get_id(file))) {
158  UI_but_drag_set_id(but, id);
159  ImBuf *preview_image = filelist_file_getimage(file);
160  if (preview_image) {
161  UI_but_drag_attach_image(but, preview_image, UI_DPI_FAC);
162  }
163  }
164  else if (sfile->browse_mode == FILE_BROWSE_MODE_ASSETS &&
165  (file->typeflag & FILE_TYPE_ASSET) != 0) {
166  ImBuf *preview_image = filelist_file_getimage(file);
167  char blend_path[FILE_MAX_LIBEXTRA];
168  if (BLO_library_path_explode(path, blend_path, NULL, NULL)) {
169  const FileAssetSelectParams *asset_params = ED_fileselect_get_asset_params(sfile);
170  BLI_assert(asset_params != NULL);
171 
173  &(AssetHandle){.file_data = file},
174  BLI_strdup(blend_path),
175  file->asset_data,
176  asset_params->import_type,
177  icon,
178  preview_image,
179  UI_DPI_FAC);
180  }
181  }
182  else {
183  /* path is no more static, cannot give it directly to but... */
184  UI_but_drag_set_path(but, BLI_strdup(path), true);
185  }
186  }
187 }
188 
189 static void file_draw_string(int sx,
190  int sy,
191  const char *string,
192  float width,
193  int height,
194  eFontStyle_Align align,
195  const uchar col[4])
196 {
197  uiFontStyle fs;
198  rcti rect;
199  char fname[FILE_MAXFILE];
200 
201  if (string[0] == '\0' || width < 1) {
202  return;
203  }
204 
205  const uiStyle *style = UI_style_get();
206  fs = style->widget;
207 
208  BLI_strncpy(fname, string, FILE_MAXFILE);
209  UI_text_clip_middle_ex(&fs, fname, width, UI_DPI_ICON_SIZE, sizeof(fname), '\0');
210 
211  /* no text clipping needed, UI_fontstyle_draw does it but is a bit too strict
212  * (for buttons it works) */
213  rect.xmin = sx;
214  rect.xmax = sx + round_fl_to_int(width);
215  rect.ymin = sy - height;
216  rect.ymax = sy;
217 
218  UI_fontstyle_draw(&fs,
219  &rect,
220  fname,
221  sizeof(fname),
222  col,
223  &(struct uiFontStyleDraw_Params){
224  .align = align,
225  });
226 }
227 
234  int sy,
235  const char *string,
236  int wrap_width,
237  int line_height,
238  const uchar text_col[4],
239  int *r_sx,
240  int *r_sy)
241 {
242  rcti rect;
243 
244  if (string[0] == '\0' || wrap_width < 1) {
245  return;
246  }
247 
248  const uiStyle *style = UI_style_get();
249  int font_id = style->widget.uifont_id;
250  int len = strlen(string);
251 
252  rcti textbox;
253  BLF_wordwrap(font_id, wrap_width);
254  BLF_enable(font_id, BLF_WORD_WRAP);
255  BLF_boundbox(font_id, string, len, &textbox);
256  BLF_disable(font_id, BLF_WORD_WRAP);
257 
258  /* no text clipping needed, UI_fontstyle_draw does it but is a bit too strict
259  * (for buttons it works) */
260  rect.xmin = sx;
261  rect.xmax = sx + wrap_width;
262  /* Need to increase the clipping rect by one more line, since the #UI_fontstyle_draw_ex() will
263  * actually start drawing at (ymax - line-height). */
264  rect.ymin = sy - BLI_rcti_size_y(&textbox) - line_height;
265  rect.ymax = sy;
266 
267  struct ResultBLF result;
269  &rect,
270  string,
271  len,
272  text_col,
273  &(struct uiFontStyleDraw_Params){
274  .align = UI_STYLE_TEXT_LEFT,
275  .word_wrap = true,
276  },
277  NULL,
278  NULL,
279  &result);
280  if (r_sx) {
281  *r_sx = result.width;
282  }
283  if (r_sy) {
284  *r_sy = rect.ymin + line_height;
285  }
286 }
287 
288 void file_calc_previews(const bContext *C, ARegion *region)
289 {
290  SpaceFile *sfile = CTX_wm_space_file(C);
291  View2D *v2d = &region->v2d;
292 
293  ED_fileselect_init_layout(sfile, region);
294  UI_view2d_totRect_set(v2d, sfile->layout->width, sfile->layout->height);
295 }
296 
297 static void file_draw_preview(const SpaceFile *sfile,
298  uiBlock *block,
299  const FileDirEntry *file,
300  const char *path,
301  const rcti *tile_draw_rect,
302  const float icon_aspect,
303  ImBuf *imb,
304  const int icon,
305  FileLayout *layout,
306  const bool is_icon,
307  const bool drag,
308  const bool dimmed,
309  const bool is_link)
310 {
311  uiBut *but;
312  float fx, fy;
313  float dx, dy;
314  int xco, yco;
315  float ui_imbx, ui_imby;
316  float scaledx, scaledy;
317  float scale;
318  int ex, ey;
319  bool show_outline = !is_icon &&
321  const bool is_offline = (file->attributes & FILE_ATTR_OFFLINE);
322 
323  BLI_assert(imb != NULL);
324 
325  ui_imbx = imb->x * UI_DPI_FAC;
326  ui_imby = imb->y * UI_DPI_FAC;
327  /* Unlike thumbnails, icons are not scaled up. */
328  if (((ui_imbx > layout->prv_w) || (ui_imby > layout->prv_h)) ||
329  (!is_icon && ((ui_imbx < layout->prv_w) || (ui_imby < layout->prv_h)))) {
330  if (imb->x > imb->y) {
331  scaledx = (float)layout->prv_w;
332  scaledy = ((float)imb->y / (float)imb->x) * layout->prv_w;
333  scale = scaledx / imb->x;
334  }
335  else {
336  scaledy = (float)layout->prv_h;
337  scaledx = ((float)imb->x / (float)imb->y) * layout->prv_h;
338  scale = scaledy / imb->y;
339  }
340  }
341  else {
342  scaledx = ui_imbx;
343  scaledy = ui_imby;
344  scale = UI_DPI_FAC;
345  }
346 
347  ex = (int)scaledx;
348  ey = (int)scaledy;
349  fx = ((float)layout->prv_w - (float)ex) / 2.0f;
350  fy = ((float)layout->prv_h - (float)ey) / 2.0f;
351  dx = (fx + 0.5f + layout->prv_border_x);
352  dy = (fy + 0.5f - layout->prv_border_y);
353  xco = tile_draw_rect->xmin + (int)dx;
354  yco = tile_draw_rect->ymax - layout->prv_h + (int)dy;
355 
357 
358  /* the large image */
359 
360  float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
361  if (is_icon) {
362  if (file->typeflag & FILE_TYPE_DIR) {
364  }
365  else {
367  }
368  }
369  else if (file->typeflag & FILE_TYPE_FTFONT) {
371  }
372 
373  if (dimmed) {
374  col[3] *= 0.3f;
375  }
376 
377  if (!is_icon && file->typeflag & FILE_TYPE_BLENDERLIB) {
378  /* Datablock preview images use premultiplied alpha. */
380  }
381 
384  (float)xco,
385  (float)yco,
386  imb->x,
387  imb->y,
388  GPU_RGBA8,
389  true,
390  imb->rect,
391  scale,
392  scale,
393  1.0f,
394  1.0f,
395  col);
396 
398 
399  if (icon && is_icon) {
400  /* Small icon in the middle of large image, scaled to fit container and UI scale */
401  float icon_x, icon_y;
402  const float icon_size = 16.0f / icon_aspect * U.dpi_fac;
403  float icon_opacity = 0.3f;
404  uchar icon_color[4] = {0, 0, 0, 255};
405  float bgcolor[4];
407  if (rgb_to_grayscale(bgcolor) < 0.5f) {
408  icon_color[0] = 255;
409  icon_color[1] = 255;
410  icon_color[2] = 255;
411  }
412  icon_x = xco + (ex / 2.0f) - (icon_size / 2.0f);
413  icon_y = yco + (ey / 2.0f) - (icon_size * ((file->typeflag & FILE_TYPE_DIR) ? 0.78f : 0.75f));
415  icon_x, icon_y, icon, icon_aspect / U.dpi_fac, icon_opacity, 0.0f, icon_color, false);
416  }
417 
418  if (is_link || is_offline) {
419  /* Icon at bottom to indicate it is a shortcut, link, alias, or offline. */
420  float icon_x, icon_y;
421  icon_x = xco + (2.0f * UI_DPI_FAC);
422  icon_y = yco + (2.0f * UI_DPI_FAC);
423  const int arrow = is_link ? ICON_LOOP_FORWARDS : ICON_URL;
424  if (!is_icon) {
425  /* At very bottom-left if preview style. */
426  const uchar dark[4] = {0, 0, 0, 255};
427  const uchar light[4] = {255, 255, 255, 255};
428  UI_icon_draw_ex(icon_x + 1, icon_y - 1, arrow, 1.0f / U.dpi_fac, 0.2f, 0.0f, dark, false);
429  UI_icon_draw_ex(icon_x, icon_y, arrow, 1.0f / U.dpi_fac, 0.6f, 0.0f, light, false);
430  }
431  else {
432  /* Link to folder or non-previewed file. */
433  uchar icon_color[4];
434  UI_GetThemeColor4ubv(TH_BACK, icon_color);
435  icon_x = xco + ((file->typeflag & FILE_TYPE_DIR) ? 0.14f : 0.23f) * scaledx;
436  icon_y = yco + ((file->typeflag & FILE_TYPE_DIR) ? 0.24f : 0.14f) * scaledy;
438  icon_x, icon_y, arrow, icon_aspect / U.dpi_fac * 1.8, 0.3f, 0.0f, icon_color, false);
439  }
440  }
441  else if (icon && !is_icon && !(file->typeflag & FILE_TYPE_FTFONT)) {
442  /* Smaller, fainter icon at bottom-left for preview image thumbnail, but not for fonts. */
443  float icon_x, icon_y;
444  const uchar dark[4] = {0, 0, 0, 255};
445  const uchar light[4] = {255, 255, 255, 255};
446  icon_x = xco + (2.0f * UI_DPI_FAC);
447  icon_y = yco + (2.0f * UI_DPI_FAC);
448  UI_icon_draw_ex(icon_x + 1, icon_y - 1, icon, 1.0f / U.dpi_fac, 0.2f, 0.0f, dark, false);
449  UI_icon_draw_ex(icon_x, icon_y, icon, 1.0f / U.dpi_fac, 0.6f, 0.0f, light, false);
450  }
451 
452  const bool is_current_main_data = filelist_file_get_id(file) != NULL;
453  if (is_current_main_data) {
454  /* Smaller, fainter icon at the top-right indicating that the file represents data from the
455  * current file (from current #Main in fact). */
456  float icon_x, icon_y;
457  const uchar light[4] = {255, 255, 255, 255};
458  icon_x = xco + ex - UI_UNIT_X;
459  icon_y = yco + ey - UI_UNIT_Y;
460  UI_icon_draw_ex(icon_x, icon_y, ICON_CURRENT_FILE, 1.0f / U.dpi_fac, 0.6f, 0.0f, light, false);
461  }
462 
463  /* Contrasting outline around some preview types. */
464  if (show_outline) {
468  float border_color[4] = {1.0f, 1.0f, 1.0f, 0.4f};
469  float bgcolor[4];
470  UI_GetThemeColor4fv(TH_BACK, bgcolor);
471  if (rgb_to_grayscale(bgcolor) > 0.5f) {
472  border_color[0] = 0.0f;
473  border_color[1] = 0.0f;
474  border_color[2] = 0.0f;
475  }
476  immUniformColor4fv(border_color);
477  imm_draw_box_wire_2d(pos, (float)xco, (float)yco, (float)(xco + ex), (float)(yco + ey));
479  }
480 
481  /* Invisible button for dragging. */
482  rcti drag_rect = *tile_draw_rect;
483  /* A bit smaller than the full tile, to increase the gap between items that users can drag from
484  * for box select. */
485  BLI_rcti_pad(&drag_rect, -layout->tile_border_x, -layout->tile_border_y);
486 
487  but = uiDefBut(block,
489  0,
490  "",
491  drag_rect.xmin,
492  drag_rect.ymin,
493  BLI_rcti_size_x(&drag_rect),
494  BLI_rcti_size_y(&drag_rect),
495  NULL,
496  0.0,
497  0.0,
498  0,
499  0,
500  NULL);
501 
502  /* Drag-region. */
503  if (drag) {
504  ID *id;
505 
506  if ((id = filelist_file_get_id(file))) {
507  UI_but_drag_set_id(but, id);
508  UI_but_drag_attach_image(but, imb, scale);
509  }
510  /* path is no more static, cannot give it directly to but... */
511  else if (sfile->browse_mode == FILE_BROWSE_MODE_ASSETS &&
512  (file->typeflag & FILE_TYPE_ASSET) != 0) {
513  char blend_path[FILE_MAX_LIBEXTRA];
514 
515  if (BLO_library_path_explode(path, blend_path, NULL, NULL)) {
516  const FileAssetSelectParams *asset_params = ED_fileselect_get_asset_params(sfile);
517  BLI_assert(asset_params != NULL);
518 
520  &(AssetHandle){.file_data = file},
521  BLI_strdup(blend_path),
522  file->asset_data,
523  asset_params->import_type,
524  icon,
525  imb,
526  scale);
527  }
528  }
529  else {
530  UI_but_drag_set_image(but, BLI_strdup(path), icon, imb, scale, true);
531  }
532  }
533 
535 }
536 
537 static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
538 {
539  char newname[FILE_MAX + 12];
540  char orgname[FILE_MAX + 12];
541  char filename[FILE_MAX + 12];
543  wmWindow *win = CTX_wm_window(C);
544  SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C);
545  ARegion *region = CTX_wm_region(C);
547 
548  BLI_join_dirfile(orgname, sizeof(orgname), params->dir, oldname);
549  BLI_strncpy(filename, params->renamefile, sizeof(filename));
550  BLI_filename_make_safe(filename);
551  BLI_join_dirfile(newname, sizeof(newname), params->dir, filename);
552 
553  if (!STREQ(orgname, newname)) {
554  if (!BLI_exists(newname)) {
555  errno = 0;
556  if ((BLI_rename(orgname, newname) != 0) || !BLI_exists(newname)) {
557  WM_reportf(RPT_ERROR, "Could not rename: %s", errno ? strerror(errno) : "unknown error");
559  }
560  else {
561  /* If rename is successful, scroll to newly renamed entry. */
562  BLI_strncpy(params->renamefile, filename, sizeof(params->renamefile));
563  file_params_invoke_rename_postscroll(wm, win, sfile);
564  }
565 
566  /* to make sure we show what is on disk */
567  ED_fileselect_clear(wm, sfile);
568  }
569  else {
570  /* Renaming failed, reset the name for further renaming handling. */
571  BLI_strncpy(params->renamefile, oldname, sizeof(params->renamefile));
572  }
573 
574  ED_region_tag_redraw(region);
575  }
576 }
577 
578 static void draw_background(FileLayout *layout, View2D *v2d)
579 {
580  const int item_height = layout->tile_h + (2 * layout->tile_border_y);
581  int i;
582  int sy;
583 
586  float col_alternating[4];
587  UI_GetThemeColor4fv(TH_ROW_ALTERNATE, col_alternating);
588  immUniformThemeColorBlend(TH_BACK, TH_ROW_ALTERNATE, col_alternating[3]);
589 
590  /* alternating flat shade background */
591  for (i = 2; (i <= layout->rows + 1); i += 2) {
592  sy = (int)v2d->cur.ymax - layout->offset_top - i * item_height - layout->tile_border_y;
593 
594  /* Offset pattern slightly to add scroll effect. */
595  sy += round_fl_to_int(item_height * (v2d->tot.ymax - v2d->cur.ymax) / item_height);
596 
597  immRectf(pos,
598  v2d->cur.xmin,
599  (float)sy,
600  v2d->cur.xmax,
601  (float)(sy + layout->tile_h + 2 * layout->tile_border_y));
602  }
603 
605 }
606 
607 static void draw_dividers(FileLayout *layout, View2D *v2d)
608 {
609  /* vertical column dividers */
610 
611  const int step = (layout->tile_w + 2 * layout->tile_border_x);
612 
613  uint vertex_len = 0;
614  int sx = (int)v2d->tot.xmin;
615  while (sx < v2d->cur.xmax) {
616  sx += step;
617  vertex_len += 4; /* vertex_count = 2 points per line * 2 lines per divider */
618  }
619 
620  if (vertex_len > 0) {
621  int v1[2], v2[2];
622  uchar col_hi[3], col_lo[3];
623 
624  UI_GetThemeColorShade3ubv(TH_BACK, 30, col_hi);
625  UI_GetThemeColorShade3ubv(TH_BACK, -30, col_lo);
626 
627  v1[1] = v2d->cur.ymax - layout->tile_border_y;
628  v2[1] = v2d->cur.ymin;
629 
634 
636  immBegin(GPU_PRIM_LINES, vertex_len);
637 
638  sx = (int)v2d->tot.xmin;
639  while (sx < v2d->cur.xmax) {
640  sx += step;
641 
642  v1[0] = v2[0] = sx;
644  immVertex2iv(pos, v1);
645  immAttr3ubv(color, col_lo);
646  immVertex2iv(pos, v2);
647 
648  v1[0] = v2[0] = sx + 1;
650  immVertex2iv(pos, v1);
651  immAttr3ubv(color, col_hi);
652  immVertex2iv(pos, v2);
653  }
654 
655  immEnd();
657  }
658 }
659 
660 static void draw_columnheader_background(const FileLayout *layout, const View2D *v2d)
661 {
663 
666 
667  immRectf(pos,
668  v2d->cur.xmin,
669  v2d->cur.ymax - layout->attribute_column_header_h,
670  v2d->cur.xmax,
671  v2d->cur.ymax);
672 
674 }
675 
677  FileLayout *layout,
678  const View2D *v2d,
679  const uchar text_col[4])
680 {
681  const float divider_pad = 0.2 * layout->attribute_column_header_h;
682  int sx = v2d->cur.xmin, sy = v2d->cur.ymax;
683 
684  for (FileAttributeColumnType column_type = 0; column_type < ATTRIBUTE_COLUMN_MAX;
685  column_type++) {
686  if (!file_attribute_column_type_enabled(params, column_type)) {
687  continue;
688  }
689  const FileAttributeColumn *column = &layout->attribute_columns[column_type];
690 
691  /* Active sort type triangle */
692  if (params->sort == column->sort_type) {
693  float tri_color[4];
694 
695  rgba_uchar_to_float(tri_color, text_col);
696  UI_draw_icon_tri(sx + column->width - (0.3f * U.widget_unit) -
698  sy + (0.1f * U.widget_unit) - (layout->attribute_column_header_h / 2),
699  (params->flag & FILE_SORT_INVERT) ? 't' : 'v',
700  tri_color);
701  }
702 
704  sy - layout->tile_border_y,
705  IFACE_(column->name),
706  column->width - 2 * ATTRIBUTE_COLUMN_PADDING,
707  layout->attribute_column_header_h - layout->tile_border_y,
709  text_col);
710 
711  /* Separator line */
712  if (column_type != COLUMN_NAME) {
715 
719  immVertex2f(pos, sx - 1, sy - divider_pad);
720  immVertex2f(pos, sx - 1, sy - layout->attribute_column_header_h + divider_pad);
721  immEnd();
723  }
724 
725  sx += column->width;
726  }
727 
728  /* Vertical separator lines line */
729  {
734  immVertex2f(pos, v2d->cur.xmin, sy);
735  immVertex2f(pos, v2d->cur.xmax, sy);
738  immEnd();
740  }
741 }
742 
748  /* Generated string will be cached in the file, so non-const. */
750  const bool small_size,
751  const bool update_stat_strings)
752 {
753  switch (column) {
754  case COLUMN_DATETIME:
755  if (!(file->typeflag & FILE_TYPE_BLENDERLIB) && !FILENAME_IS_CURRPAR(file->relpath)) {
756  if ((file->draw_data.datetime_str[0] == '\0') || update_stat_strings) {
758  bool is_today, is_yesterday;
759 
761  NULL, file->time, small_size, time, date, &is_today, &is_yesterday);
762 
763  if (is_today || is_yesterday) {
764  BLI_strncpy(date, is_today ? N_("Today") : N_("Yesterday"), sizeof(date));
765  }
766  BLI_snprintf(file->draw_data.datetime_str,
767  sizeof(file->draw_data.datetime_str),
768  "%s %s",
769  date,
770  time);
771  }
772 
773  return file->draw_data.datetime_str;
774  }
775  break;
776  case COLUMN_SIZE:
777  if ((file->typeflag & (FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP)) ||
778  !(file->typeflag & (FILE_TYPE_DIR | FILE_TYPE_BLENDERLIB))) {
779  if ((file->draw_data.size_str[0] == '\0') || update_stat_strings) {
781  NULL, file->size, small_size, file->draw_data.size_str);
782  }
783 
784  return file->draw_data.size_str;
785  }
786  break;
787  default:
788  break;
789  }
790 
791  return NULL;
792 }
793 
795  const FileLayout *layout,
797  const rcti *tile_draw_rect,
798  const uchar text_col[4])
799 {
800  const bool small_size = SMALL_SIZE_CHECK(params->thumbnail_size);
801  const bool update_stat_strings = small_size != SMALL_SIZE_CHECK(layout->curr_size);
802  int sx = tile_draw_rect->xmin - layout->tile_border_x - (UI_UNIT_X * 0.1f);
803 
804  for (FileAttributeColumnType column_type = 0; column_type < ATTRIBUTE_COLUMN_MAX;
805  column_type++) {
806  const FileAttributeColumn *column = &layout->attribute_columns[column_type];
807 
808  /* Name column is not a detail column (should already be drawn), always skip here. */
809  if (column_type == COLUMN_NAME) {
810  sx += column->width;
811  continue;
812  }
813  if (!file_attribute_column_type_enabled(params, column_type)) {
814  continue;
815  }
816 
818  column_type, file, small_size, update_stat_strings);
819 
820  if (str) {
822  tile_draw_rect->ymax - layout->tile_border_y,
823  IFACE_(str),
824  column->width - 2 * ATTRIBUTE_COLUMN_PADDING,
825  layout->tile_h,
826  column->text_align,
827  text_col);
828  }
829 
830  sx += column->width;
831  }
832 }
833 
834 static rcti tile_draw_rect_get(const View2D *v2d,
835  const FileLayout *layout,
836  const enum eFileDisplayType display,
837  const int file_idx,
838  const int padx)
839 {
840  int tile_pos_x, tile_pos_y;
841  ED_fileselect_layout_tilepos(layout, file_idx, &tile_pos_x, &tile_pos_y);
842  tile_pos_x += (int)(v2d->tot.xmin);
843  tile_pos_y = (int)(v2d->tot.ymax - tile_pos_y);
844 
845  rcti rect;
846  rect.xmin = tile_pos_x + padx;
847  rect.xmax = rect.xmin + (ELEM(display, FILE_VERTICALDISPLAY, FILE_HORIZONTALDISPLAY) ?
848  layout->tile_w - (2 * padx) :
849  layout->tile_w);
850  rect.ymax = tile_pos_y;
851  rect.ymin = rect.ymax - layout->tile_h - layout->tile_border_y;
852 
853  return rect;
854 }
855 
856 void file_draw_list(const bContext *C, ARegion *region)
857 {
859  wmWindow *win = CTX_wm_window(C);
860  SpaceFile *sfile = CTX_wm_space_file(C);
862  FileLayout *layout = ED_fileselect_get_layout(sfile, region);
863  View2D *v2d = &region->v2d;
864  struct FileList *files = sfile->files;
865  struct FileDirEntry *file;
866  const char *root = filelist_dir(files);
867  ImBuf *imb;
868  uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS);
869  int numfiles;
870  int numfiles_layout;
871  int offset;
872  int textwidth, textheight;
873  int i;
874  bool is_icon;
875  eFontStyle_Align align;
876  bool do_drag;
877  uchar text_col[4];
878  const bool draw_columnheader = (params->display == FILE_VERTICALDISPLAY);
879  const float thumb_icon_aspect = MIN2(64.0f / (float)(params->thumbnail_size), 1.0f);
880 
881  numfiles = filelist_files_ensure(files);
882 
883  if (params->display != FILE_IMGDISPLAY) {
884  draw_background(layout, v2d);
885  draw_dividers(layout, v2d);
886  }
887 
889  layout, (int)region->v2d.cur.xmin, (int)-region->v2d.cur.ymax);
890  if (offset < 0) {
891  offset = 0;
892  }
893 
894  numfiles_layout = ED_fileselect_layout_numfiles(layout, region);
895 
896  /* adjust, so the next row is already drawn when scrolling */
897  if (layout->flag & FILE_LAYOUT_HOR) {
898  numfiles_layout += layout->rows;
899  }
900  else {
901  numfiles_layout += layout->flow_columns;
902  }
903 
904  filelist_file_cache_slidingwindow_set(files, numfiles_layout);
905 
906  textwidth = (FILE_IMGDISPLAY == params->display) ?
907  layout->tile_w :
909  textheight = (int)(layout->textheight * 3.0 / 2.0 + 0.5);
910 
912 
913  if (numfiles > 0) {
914  const bool success = filelist_file_cache_block(
915  files, min_ii(offset + (numfiles_layout / 2), numfiles - 1));
916  BLI_assert(success);
917  UNUSED_VARS_NDEBUG(success);
918 
920 
921  /* Handle preview timer here,
922  * since it's filelist_file_cache_block() and filelist_cache_previews_update()
923  * which controls previews task. */
924  {
925  const bool previews_running = filelist_cache_previews_running(files) &&
927  // printf("%s: preview task: %d\n", __func__, previews_running);
928  if (previews_running && !sfile->previews_timer) {
930  wm, win, NC_SPACE | ND_SPACE_FILE_PREVIEW, 0.01);
931  }
932  if (!previews_running && sfile->previews_timer) {
933  /* Preview is not running, no need to keep generating update events! */
934  // printf("%s: Inactive preview task, sleeping!\n", __func__);
936  sfile->previews_timer = NULL;
937  }
938  }
939  }
940 
942 
943  UI_GetThemeColor4ubv(TH_TEXT, text_col);
944 
945  for (i = offset; (i < numfiles) && (i < offset + numfiles_layout); i++) {
946  uint file_selflag;
947  char path[FILE_MAX_LIBEXTRA];
948  const int padx = 0.1f * UI_UNIT_X;
949  int icon_ofs = 0;
950 
951  const rcti tile_draw_rect = tile_draw_rect_get(v2d, layout, params->display, i, padx);
952 
953  file = filelist_file(files, i);
954  file_selflag = filelist_entry_select_get(sfile->files, file, CHECK_ALL);
955 
956  BLI_join_dirfile(path, sizeof(path), root, file->relpath);
957 
958  if (!(file_selflag & FILE_SEL_EDITING)) {
959  if ((params->highlight_file == i) || (file_selflag & FILE_SEL_HIGHLIGHTED) ||
960  (file_selflag & FILE_SEL_SELECTED)) {
961  int colorid = (file_selflag & FILE_SEL_SELECTED) ? TH_HILITE : TH_BACK;
962  int shade = (params->highlight_file == i) || (file_selflag & FILE_SEL_HIGHLIGHTED) ? 35 :
963  0;
964  BLI_assert(i == 0 || !FILENAME_IS_CURRPAR(file->relpath));
965 
966  rcti tile_bg_rect = tile_draw_rect;
967  /* One pixel downwards, places it more in the center. */
968  BLI_rcti_translate(&tile_bg_rect, 0, -1);
969  draw_tile_background(&tile_bg_rect, colorid, shade);
970  }
971  }
973 
974  /* don't drag parent or refresh items */
975  do_drag = !(FILENAME_IS_CURRPAR(file->relpath));
976  const bool is_hidden = (file->attributes & FILE_ATTR_HIDDEN);
977  const bool is_link = (file->attributes & FILE_ATTR_ANY_LINK);
978 
979  if (FILE_IMGDISPLAY == params->display) {
980  const int icon = filelist_geticon(files, i, false);
981  is_icon = 0;
982  imb = filelist_getimage(files, i);
983  if (!imb) {
984  imb = filelist_geticon_image(files, i);
985  is_icon = 1;
986  }
987 
988  file_draw_preview(sfile,
989  block,
990  file,
991  path,
992  &tile_draw_rect,
993  thumb_icon_aspect,
994  imb,
995  icon,
996  layout,
997  is_icon,
998  do_drag,
999  is_hidden,
1000  is_link);
1001  }
1002  else {
1003  file_draw_icon(sfile,
1004  block,
1005  file,
1006  path,
1007  &tile_draw_rect,
1008  filelist_geticon(files, i, true),
1011  do_drag,
1012  is_hidden);
1013  icon_ofs += ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X;
1014  }
1015 
1016  if (file_selflag & FILE_SEL_EDITING) {
1017  const short width = (params->display == FILE_IMGDISPLAY) ?
1018  textwidth :
1021 
1022  uiBut *but = uiDefBut(block,
1023  UI_BTYPE_TEXT,
1024  1,
1025  "",
1026  tile_draw_rect.xmin + icon_ofs,
1027  tile_draw_rect.ymin + layout->tile_border_y - 0.15f * UI_UNIT_X,
1028  width - icon_ofs,
1029  textheight,
1030  params->renamefile,
1031  1.0f,
1032  (float)sizeof(params->renamefile),
1033  0,
1034  0,
1035  "");
1037  UI_but_flag_enable(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
1039  if (false == UI_but_active_only(C, region, block, but)) {
1040  /* Note that this is the only place where we can also handle a cancelled renaming. */
1041 
1042  file_params_rename_end(wm, win, sfile, file);
1043 
1044  /* After the rename button is removed, we need to make sure the view is redrawn once more,
1045  * in case selection changed. Usually UI code would trigger that redraw, but the rename
1046  * operator may have been called from a different region.
1047  * Tagging regions for redrawing while drawing is rightfully prevented. However, this
1048  * active button removing basically introduces handling logic to drawing code. So a
1049  * notifier should be an acceptable workaround. */
1051 
1052  file_selflag = filelist_entry_select_get(sfile->files, file, CHECK_ALL);
1053  }
1054  }
1055 
1056  /* file_selflag might have been modified by branch above. */
1057  if ((file_selflag & FILE_SEL_EDITING) == 0) {
1058  const int txpos = (params->display == FILE_IMGDISPLAY) ? tile_draw_rect.xmin :
1059  tile_draw_rect.xmin + 1 + icon_ofs;
1060  const int typos = (params->display == FILE_IMGDISPLAY) ?
1061  tile_draw_rect.ymin + layout->tile_border_y + layout->textheight :
1062  tile_draw_rect.ymax - layout->tile_border_y;
1063  const int twidth = (params->display == FILE_IMGDISPLAY) ?
1064  textwidth :
1065  textwidth - 1 - icon_ofs - padx - layout->tile_border_x;
1066  file_draw_string(txpos, typos, file->name, (float)twidth, textheight, align, text_col);
1067  }
1068 
1069  if (params->display != FILE_IMGDISPLAY) {
1070  draw_details_columns(params, layout, file, &tile_draw_rect, text_col);
1071  }
1072  }
1073 
1075 
1076  UI_block_end(C, block);
1077  UI_block_draw(C, block);
1078 
1079  /* Draw last, on top of file list. */
1080  if (draw_columnheader) {
1081  draw_columnheader_background(layout, v2d);
1082  draw_columnheader_columns(params, layout, v2d, text_col);
1083  }
1084 
1085  layout->curr_size = params->thumbnail_size;
1086 }
1087 
1089  const SpaceFile *sfile,
1090  ARegion *region,
1091  FileAssetSelectParams *asset_params)
1092 {
1093  char library_ui_path[PATH_MAX];
1094  file_path_to_ui_path(asset_params->base_params.dir, library_ui_path, sizeof(library_ui_path));
1095 
1096  uchar text_col[4];
1097  UI_GetThemeColor4ubv(TH_TEXT, text_col);
1098 
1099  const View2D *v2d = &region->v2d;
1100  const int pad = sfile->layout->tile_border_x;
1101  const int width = BLI_rctf_size_x(&v2d->tot) - (2 * pad);
1102  const int line_height = sfile->layout->textheight;
1103  int sx = v2d->tot.xmin + pad;
1104  /* For some reason no padding needed. */
1105  int sy = v2d->tot.ymax;
1106 
1107  {
1108  const char *message = TIP_("Path to asset library does not exist:");
1109  file_draw_string_multiline(sx, sy, message, width, line_height, text_col, NULL, &sy);
1110 
1111  sy -= line_height;
1112  file_draw_string(sx, sy, library_ui_path, width, line_height, UI_STYLE_TEXT_LEFT, text_col);
1113  }
1114 
1115  /* Separate a bit further. */
1116  sy -= line_height * 2.2f;
1117 
1118  {
1119  UI_icon_draw(sx, sy - UI_UNIT_Y, ICON_INFO);
1120 
1121  const char *suggestion = TIP_(
1122  "Asset Libraries are local directories that can contain .blend files with assets inside.\n"
1123  "Manage Asset Libraries from the File Paths section in Preferences");
1125  sx + UI_UNIT_X, sy, suggestion, width - UI_UNIT_X, line_height, text_col, NULL, &sy);
1126 
1127  uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS);
1128  uiBut *but = uiDefIconTextButO(block,
1129  UI_BTYPE_BUT,
1130  "SCREEN_OT_userpref_show",
1132  ICON_PREFERENCES,
1133  NULL,
1134  sx + UI_UNIT_X,
1135  sy - line_height - UI_UNIT_Y * 1.2f,
1136  UI_UNIT_X * 8,
1137  UI_UNIT_Y,
1138  NULL);
1139  PointerRNA *but_opptr = UI_but_operator_ptr_get(but);
1140  RNA_enum_set(but_opptr, "section", USER_SECTION_FILE_PATHS);
1141 
1142  UI_block_end(C, block);
1143  UI_block_draw(C, block);
1144  }
1145 }
1146 
1148  const SpaceFile *sfile,
1149  ARegion *region,
1150  const char *blendfile_path,
1151  ReportList *reports)
1152 {
1153  uchar text_col[4];
1154  UI_GetThemeColor4ubv(TH_TEXT, text_col);
1155 
1156  const View2D *v2d = &region->v2d;
1157  const int pad = sfile->layout->tile_border_x;
1158  const int width = BLI_rctf_size_x(&v2d->tot) - (2 * pad);
1159  const int line_height = sfile->layout->textheight;
1160  int sx = v2d->tot.xmin + pad;
1161  /* For some reason no padding needed. */
1162  int sy = v2d->tot.ymax;
1163 
1164  {
1165  const char *message = TIP_("Unreadable Blender library file:");
1166  file_draw_string_multiline(sx, sy, message, width, line_height, text_col, NULL, &sy);
1167 
1168  sy -= line_height;
1169  file_draw_string(sx, sy, blendfile_path, width, line_height, UI_STYLE_TEXT_LEFT, text_col);
1170  }
1171 
1172  /* Separate a bit further. */
1173  sy -= line_height * 2.2f;
1174 
1175  LISTBASE_FOREACH (Report *, report, &reports->list) {
1176  const short report_type = report->type;
1177  if (report_type <= RPT_INFO) {
1178  continue;
1179  }
1180 
1181  int icon = ICON_INFO;
1182  if (report_type > RPT_WARNING) {
1183  icon = ICON_ERROR;
1184  }
1185  UI_icon_draw(sx, sy - UI_UNIT_Y, icon);
1186 
1188  sy,
1189  TIP_(report->message),
1190  width - UI_UNIT_X,
1191  line_height,
1192  text_col,
1193  NULL,
1194  &sy);
1195  sy -= line_height;
1196  }
1197 }
1198 
1199 bool file_draw_hint_if_invalid(const bContext *C, const SpaceFile *sfile, ARegion *region)
1200 {
1201  char blendfile_path[FILE_MAX_LIBEXTRA];
1202  const bool is_asset_browser = ED_fileselect_is_asset_browser(sfile);
1203  const bool is_library_browser = !is_asset_browser &&
1204  filelist_islibrary(sfile->files, blendfile_path, NULL);
1205 
1206  if (is_asset_browser) {
1208 
1209  /* Check if the asset library exists. */
1210  if (!((asset_params->asset_library_ref.type == ASSET_LIBRARY_LOCAL) ||
1211  filelist_is_dir(sfile->files, asset_params->base_params.dir))) {
1212  file_draw_invalid_asset_library_hint(C, sfile, region, asset_params);
1213  return true;
1214  }
1215  }
1216 
1217  /* Check if the blendfile library is valid (has entries). */
1218  if (is_library_browser) {
1219  if (!filelist_is_ready(sfile->files)) {
1220  return false;
1221  }
1222 
1223  const int numfiles = filelist_files_num_entries(sfile->files);
1224  if (numfiles > 0) {
1225  return false;
1226  }
1227 
1228  /* This could all be part of the file-list loading:
1229  * - When loading fails this could be saved in the file-list, e.g. when
1230  * `BLO_blendhandle_from_file()` returns null in `filelist_readjob_list_lib()`, a
1231  * `FL_HAS_INVALID_LIBRARY` file-list flag could be set.
1232  * - Reports from it could also be stored in `FileList` rather than being ignored
1233  * (`RPT_STORE` must be set!).
1234  * - Then we could just check for `is_library_browser` and the `FL_HAS_INVALID_LIBRARY` flag
1235  * here, and draw the hint with the reports in the file-list. (We would not draw a hint for
1236  * recursive loading, even if the file-list has the "has invalid library" flag set, which
1237  * seems like the wanted behavior.)
1238  * - The call to BKE_blendfile_is_readable() would not be needed then.
1239  */
1240  if (!sfile->runtime->is_blendfile_status_set) {
1243  blendfile_path, &sfile->runtime->is_blendfile_readable_reports);
1244  sfile->runtime->is_blendfile_status_set = true;
1245  }
1246  if (!sfile->runtime->is_blendfile_readable) {
1248  C, sfile, region, blendfile_path, &sfile->runtime->is_blendfile_readable_reports);
1249  return true;
1250  }
1251  }
1252 
1253  return false;
1254 }
typedef float(TangentPoint)[2]
IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
Definition: glutil.c:44
void immDrawPixelsTexTiled_scaling(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:300
bool BKE_blendfile_is_readable(const char *path, struct ReportList *reports)
Definition: blendfile.c:68
struct wmWindowManager * CTX_wm_manager(const bContext *C)
Definition: context.c:713
struct SpaceLink * CTX_wm_space_data(const bContext *C)
Definition: context.c:743
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:749
struct SpaceFile * CTX_wm_space_file(const bContext *C)
Definition: context.c:842
struct wmWindow * CTX_wm_window(const bContext *C)
Definition: context.c:723
void BKE_reports_clear(ReportList *reports)
Definition: report.c:63
@ BLF_WORD_WRAP
Definition: BLF_api.h:340
void BLF_disable(int fontid, int option)
Definition: blf.c:279
void BLF_batch_draw_begin(void)
Definition: blf.c:466
void BLF_enable(int fontid, int option)
Definition: blf.c:270
void BLF_batch_draw_end(void)
Definition: blf.c:479
void BLF_wordwrap(int fontid, int wrap_width)
Definition: blf.c:787
void BLF_boundbox(int fontid, const char *str, size_t str_len, struct rcti *box) ATTR_NONNULL()
Definition: blf.c:657
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition: BLI_assert.h:53
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: storage.c:314
#define FILE_ATTR_ANY_LINK
Definition: BLI_fileops.h:105
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:1268
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)
Definition: BLI_filelist.c:323
@ FILE_ATTR_HIDDEN
Definition: BLI_fileops.h:88
@ FILE_ATTR_OFFLINE
Definition: BLI_fileops.h:96
#define PATH_MAX
Definition: BLI_fileops.h:29
Some types for dealing with directories.
#define FILELIST_DIRENTRY_DATE_LEN
#define FILELIST_DIRENTRY_TIME_LEN
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
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:383
#define FILE_MAXFILE
#define FILE_MAX
#define FILENAME_IS_CURRPAR(_n)
bool BLI_filename_make_safe(char *fname) ATTR_NONNULL(1)
Definition: path_util.c:309
void BLI_join_dirfile(char *__restrict dst, size_t maxlen, const char *__restrict dir, const char *__restrict file) ATTR_NONNULL()
Definition: path_util.c:1531
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition: BLI_rect.h:190
void BLI_rcti_pad(struct rcti *rect, int pad_x, int pad_y)
Definition: rct.c:607
void BLI_rcti_translate(struct rcti *rect, int x, int y)
Definition: rct.c:559
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition: BLI_rect.h:186
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:194
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
Definition: string.c:42
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
unsigned char uchar
Definition: BLI_sys_types.h:70
unsigned int uint
Definition: BLI_sys_types.h:67
#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:1503
#define TIP_(msgid)
#define IFACE_(msgid)
@ ASSET_LIBRARY_LOCAL
@ 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_BROWSE_MODE_ASSETS
@ FILE_SEL_EDITING
@ FILE_SEL_HIGHLIGHTED
@ FILE_SEL_SELECTED
eFileDisplayType
@ FILE_VERTICALDISPLAY
@ FILE_IMGDISPLAY
@ FILE_HORIZONTALDISPLAY
@ FILE_SORT_INVERT
#define FILE_MAX_LIBEXTRA
@ USER_SECTION_FILE_PATHS
struct FileAssetSelectParams * ED_fileselect_get_asset_params(const struct SpaceFile *sfile)
#define FILE_LAYOUT_HOR
Definition: ED_fileselect.h:30
int ED_fileselect_layout_offset(FileLayout *layout, int x, int y)
Definition: filesel.c:760
void ED_fileselect_clear(struct wmWindowManager *wm, struct SpaceFile *sfile)
Definition: filesel.c:1213
bool ED_fileselect_is_asset_browser(const struct SpaceFile *sfile)
int ED_fileselect_layout_numfiles(FileLayout *layout, struct ARegion *region)
Definition: filesel.c:677
struct FileSelectParams * ED_fileselect_get_active_params(const struct SpaceFile *sfile)
FileAttributeColumnType
Definition: ED_fileselect.h:33
@ COLUMN_DATETIME
Definition: ED_fileselect.h:36
@ ATTRIBUTE_COLUMN_MAX
Definition: ED_fileselect.h:39
@ COLUMN_NAME
Definition: ED_fileselect.h:35
@ COLUMN_SIZE
Definition: ED_fileselect.h:37
void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *region)
Definition: filesel.c:961
FileLayout * ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *region)
Definition: filesel.c:1064
void ED_fileselect_layout_tilepos(const FileLayout *layout, int tile, int *x, int *y)
Definition: filesel.c:811
void ED_region_tag_redraw(struct ARegion *region)
Definition: area.c:655
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 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 width
_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:20
@ GPU_SHADER_2D_UNIFORM_COLOR
Definition: GPU_shader.h:201
@ GPU_SHADER_2D_IMAGE_COLOR
Definition: GPU_shader.h:217
@ GPU_SHADER_2D_FLAT_COLOR
Definition: GPU_shader.h:208
@ GPU_BLEND_NONE
Definition: GPU_state.h:60
@ GPU_BLEND_ALPHA
Definition: GPU_state.h:62
@ GPU_BLEND_ALPHA_PREMULT
Definition: GPU_state.h:63
void GPU_blend(eGPUBlend blend)
Definition: gpu_state.cc:39
@ GPU_RGBA8
Definition: GPU_texture.h:87
@ 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.
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert a color
#define C
Definition: RandGen.cpp:25
void UI_but_flag_disable(uiBut *but, int flag)
Definition: interface.cc:5863
#define UI_UNIT_Y
@ UI_BUT_UNDO
Definition: UI_interface.h:205
@ UI_BUT_DISABLED
Definition: UI_interface.h:196
@ UI_BUT_NO_UTF8
Definition: UI_interface.h:207
@ UI_EMBOSS
Definition: UI_interface.h:108
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.cc:5336
void UI_draw_icon_tri(float x, float y, char dir, const float[4])
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.cc:4806
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *arg, uiFreeArgFunc free_arg)
Definition: interface.cc:6029
struct PointerRNA * UI_but_operator_ptr_get(uiBut *but)
Definition: interface.cc:5908
void UI_fontstyle_draw_ex(const struct uiFontStyle *fs, const struct rcti *rect, const char *str, size_t str_len, const uchar col[4], const struct uiFontStyleDraw_Params *fs_params, int *r_xofs, int *r_yofs, struct ResultBLF *r_info)
const struct uiStyle * UI_style_get(void)
bool UI_but_is_utf8(const uiBut *but)
void UI_draw_roundbox_corner_set(int type)
float UI_text_clip_middle_ex(const struct uiFontStyle *fstyle, char *str, float okwidth, float minwidth, size_t max_len, char rpart_sep)
void UI_but_drag_set_id(uiBut *but, struct ID *id)
eFontStyle_Align
@ UI_STYLE_TEXT_LEFT
@ UI_STYLE_TEXT_CENTER
void UI_but_drag_set_image(uiBut *but, const char *path, int icon, struct ImBuf *imb, float scale, bool use_free)
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.cc:5258
#define UI_DPI_ICON_SIZE
Definition: UI_interface.h:307
void UI_but_drag_set_path(uiBut *but, const char *path, bool use_free)
uiBut * uiDefIconTextButO(uiBlock *block, int type, const char *opname, wmOperatorCallContext opcontext, int icon, const char *str, int x, int y, short width, short height, const char *tip)
Definition: interface.cc:5774
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.cc:5965
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.cc:5983
#define UI_DPI_FAC
Definition: UI_interface.h:305
void UI_fontstyle_draw(const struct uiFontStyle *fs, const struct rcti *rect, const char *str, size_t str_len, const uchar col[4], const struct uiFontStyleDraw_Params *fs_params)
void UI_draw_roundbox_aa(const struct rctf *rect, bool filled, float rad, const float color[4])
@ UI_CNR_ALL
@ UI_CNR_NONE
uiBlock * UI_block_begin(const struct bContext *C, struct ARegion *region, const char *name, eUIEmbossType emboss)
void UI_but_drag_set_asset(uiBut *but, const struct AssetHandle *asset, const char *path, struct AssetMetaData *metadata, int import_type, int icon, struct ImBuf *imb, float scale)
void UI_but_drag_attach_image(uiBut *but, struct ImBuf *imb, float scale)
void UI_but_func_complete_set(uiBut *but, uiButCompleteFunc func, void *arg)
Definition: interface.cc:6018
void UI_but_funcN_set(uiBut *but, uiButHandleNFunc funcN, void *argN, void *arg2)
Definition: interface.cc:6007
#define UI_UNIT_X
@ UI_BTYPE_BUT
Definition: UI_interface.h:330
@ UI_BTYPE_TEXT
Definition: UI_interface.h:332
@ UI_BTYPE_LABEL
Definition: UI_interface.h:354
void UI_but_flag_enable(uiBut *but, int flag)
Definition: interface.cc:5858
bool UI_but_flag_is_set(uiBut *but, int flag)
Definition: interface.cc:5868
void UI_icon_draw(float x, float y, int icon_id)
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)
#define ICON_DEFAULT_WIDTH_SCALE
#define ICON_DEFAULT_HEIGHT_SCALE
@ TH_ROW_ALTERNATE
Definition: UI_resources.h:262
@ TH_ICON_FOLDER
Definition: UI_resources.h:276
@ TH_BACK
Definition: UI_resources.h:39
@ TH_HILITE
Definition: UI_resources.h:66
@ TH_TEXT
Definition: UI_resources.h:42
void UI_GetThemeColor4fv(int colorid, float col[4])
Definition: resources.c:1173
void UI_GetThemeColorShade4fv(int colorid, int offset, float col[4])
Definition: resources.c:1331
void UI_GetThemeColorShade3ubv(int colorid, int offset, unsigned char col[3])
Definition: resources.c:1208
void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
Definition: resources.c:1352
void UI_view2d_totRect_set(struct View2D *v2d, int width, int height)
Definition: view2d.cc:1022
#define ND_SPACE_FILE_PREVIEW
Definition: WM_types.h:483
@ WM_OP_INVOKE_DEFAULT
Definition: WM_types.h:201
#define ND_SPACE_FILE_PARAMS
Definition: WM_types.h:466
#define NC_SPACE
Definition: WM_types.h:342
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
Definition: draw_manager.c:108
#define str(s)
static void draw_dividers(FileLayout *layout, View2D *v2d)
Definition: file_draw.c:607
static void draw_details_columns(const FileSelectParams *params, const FileLayout *layout, FileDirEntry *file, const rcti *tile_draw_rect, const uchar text_col[4])
Definition: file_draw.c:794
void file_calc_previews(const bContext *C, ARegion *region)
Definition: file_draw.c:288
static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
Definition: file_draw.c:537
static void file_draw_invalid_asset_library_hint(const bContext *C, const SpaceFile *sfile, ARegion *region, FileAssetSelectParams *asset_params)
Definition: file_draw.c:1088
static void draw_tile_background(const rcti *draw_rect, int colorid, int shade)
Definition: file_draw.c:119
static void draw_columnheader_columns(const FileSelectParams *params, FileLayout *layout, const View2D *v2d, const uchar text_col[4])
Definition: file_draw.c:676
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:233
static void file_draw_invalid_library_hint(const bContext *UNUSED(C), const SpaceFile *sfile, ARegion *region, const char *blendfile_path, ReportList *reports)
Definition: file_draw.c:1147
bool file_draw_hint_if_invalid(const bContext *C, const SpaceFile *sfile, ARegion *region)
Definition: file_draw.c:1199
static char * file_draw_tooltip_func(bContext *UNUSED(C), void *argN, const char *UNUSED(tip))
Definition: file_draw.c:113
static rcti tile_draw_rect_get(const View2D *v2d, const FileLayout *layout, const enum eFileDisplayType display, const int file_idx, const int padx)
Definition: file_draw.c:834
static void draw_columnheader_background(const FileLayout *layout, const View2D *v2d)
Definition: file_draw.c:660
void ED_file_path_button(bScreen *screen, const SpaceFile *sfile, FileSelectParams *params, uiBlock *block)
Definition: file_draw.c:63
static void draw_background(FileLayout *layout, View2D *v2d)
Definition: file_draw.c:578
static const char * filelist_get_details_column_string(FileAttributeColumnType column, FileDirEntry *file, const bool small_size, const bool update_stat_strings)
Definition: file_draw.c:746
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:189
static void file_draw_preview(const SpaceFile *sfile, uiBlock *block, const FileDirEntry *file, const char *path, const rcti *tile_draw_rect, 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:297
void file_draw_list(const bContext *C, ARegion *region)
Definition: file_draw.c:856
static void file_draw_icon(const SpaceFile *sfile, uiBlock *block, const FileDirEntry *file, const char *path, const rcti *tile_draw_rect, int icon, int width, int height, bool drag, bool dimmed)
Definition: file_draw.c:130
int autocomplete_directory(struct bContext *C, char *str, void *arg_v)
void file_params_invoke_rename_postscroll(struct wmWindowManager *wm, struct wmWindow *win, SpaceFile *sfile)
Definition: filesel.c:1267
#define SMALL_SIZE_CHECK(_size)
Definition: file_intern.h:33
void file_directory_enter_handle(bContext *C, void *arg_unused, void *arg_but)
#define ATTRIBUTE_COLUMN_PADDING
Definition: file_intern.h:30
void file_path_to_ui_path(const char *path, char *r_pathi, int max_size)
Definition: file_utils.c:35
bool file_attribute_column_type_enabled(const FileSelectParams *params, FileAttributeColumnType column)
Definition: filesel.c:837
void file_params_rename_end(struct wmWindowManager *wm, struct wmWindow *win, SpaceFile *sfile, struct FileDirEntry *rename_file)
Definition: filesel.c:1280
void file_draw_check_cb(bContext *C, void *arg1, void *arg2)
ImBuf * filelist_geticon_image(struct FileList *filelist, const int index)
Definition: filelist.c:1327
int filelist_files_num_entries(FileList *filelist)
Definition: filelist.c:2060
bool filelist_is_ready(struct FileList *filelist)
Definition: filelist.c:2158
int filelist_geticon(struct FileList *filelist, const int index, const bool is_main)
Definition: filelist.c:1449
bool filelist_islibrary(struct FileList *filelist, char *dir, char **r_group)
Definition: filelist.c:2998
bool filelist_cache_previews_running(FileList *filelist)
Definition: filelist.c:2712
BlendHandle * filelist_lib(struct FileList *filelist)
Definition: filelist.c:2055
bool filelist_cache_previews_done(FileList *filelist)
Definition: filelist.c:2719
ID * filelist_file_get_id(const FileDirEntry *file)
Definition: filelist.c:2321
bool filelist_cache_previews_update(FileList *filelist)
Definition: filelist.c:2655
bool filelist_file_cache_block(struct FileList *filelist, const int index)
Definition: filelist.c:2416
void filelist_file_cache_slidingwindow_set(FileList *filelist, size_t window_size)
Definition: filelist.c:2348
FileDirEntry * filelist_file(struct FileList *filelist, int index)
Definition: filelist.c:2280
int filelist_files_ensure(FileList *filelist)
Definition: filelist.c:2173
ImBuf * filelist_getimage(struct FileList *filelist, const int index)
Definition: filelist.c:1296
ImBuf * filelist_file_getimage(const FileDirEntry *file)
Definition: filelist.c:1303
bool filelist_is_dir(struct FileList *filelist, const char *path)
Definition: filelist.c:2111
uint filelist_entry_select_get(FileList *filelist, FileDirEntry *entry, FileCheckType check)
Definition: filelist.c:2949
const char * filelist_dir(struct FileList *filelist)
Definition: filelist.c:2106
@ CHECK_ALL
Definition: filelist.h:35
uint pos
uint col
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
ccl_gpu_kernel_postfix ccl_global float int int sy
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
const int state
ccl_gpu_kernel_postfix ccl_global float int sx
format
Definition: logImageCore.h:38
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
Definition: rna_access.c:136
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:5015
AssetLibraryReference asset_library_ref
FileSelectParams base_params
const char * name
Definition: ED_fileselect.h:44
int prv_border_x
Definition: ED_fileselect.h:65
int prv_border_y
Definition: ED_fileselect.h:66
FileAttributeColumn attribute_columns[ATTRIBUTE_COLUMN_MAX]
Definition: ED_fileselect.h:78
int attribute_column_header_h
Definition: ED_fileselect.h:58
short curr_size
Definition: ED_fileselect.h:81
int tile_border_y
Definition: ED_fileselect.h:64
int flow_columns
Definition: ED_fileselect.h:70
int tile_border_x
Definition: ED_fileselect.h:63
Definition: DNA_ID.h:368
unsigned int * rect
ReportList is_blendfile_readable_reports
Definition: file_intern.h:180
bool is_blendfile_readable
Definition: file_intern.h:179
bool is_blendfile_status_set
Definition: file_intern.h:178
struct FileLayout * layout
struct FileList * files
struct wmTimer * previews_timer
SpaceFile_Runtime * runtime
float xmax
Definition: DNA_vec_types.h:69
float xmin
Definition: DNA_vec_types.h:69
float ymax
Definition: DNA_vec_types.h:70
float ymin
Definition: DNA_vec_types.h:70
int ymin
Definition: DNA_vec_types.h:64
int ymax
Definition: DNA_vec_types.h:64
int xmin
Definition: DNA_vec_types.h:63
int xmax
Definition: DNA_vec_types.h:63
uiFontStyle widget
int wrap_width(const struct SpaceText *st, struct ARegion *region)
#define N_(msgid)
void WM_event_add_notifier_ex(wmWindowManager *wm, const wmWindow *win, uint type, void *reference)
void WM_report_banner_show(void)
void WM_reportf(eReportType type, const char *format,...)
wmTimer * WM_event_add_timer_notifier(wmWindowManager *wm, wmWindow *win, unsigned int type, double timestep)
Definition: wm_window.c:1647
void WM_event_remove_timer_notifier(wmWindowManager *wm, wmWindow *win, wmTimer *timer)
Definition: wm_window.c:1713