[Bf-blender-cvs] [d395d84c66c] filebrowser_redesign: Draw column header in short-list view

Julian Eisel noreply at git.blender.org
Mon Jul 22 19:37:13 CEST 2019


Commit: d395d84c66c4d84c1c3b10062e47ef41d9effd06
Author: Julian Eisel
Date:   Mon Jul 22 16:49:04 2019 +0200
Branches: filebrowser_redesign
https://developer.blender.org/rBd395d84c66c4d84c1c3b10062e47ef41d9effd06

Draw column header in short-list view

Similar to what you know from other file browsers, at the table top
there's a row indicating column names and showing a little triangle to
mark which column is used for sorting. Later, this will become
interactive (to allow selecting sort method by clicking on a column
name).

I decided to hardcode drawing of this (like the rest of the file
browser) and just offset the file layout a bit. However that requires
some hacks for View2D and that the offset is respected in multiple
places. So now I think using a separate region instead makes more sense.
Leaving this as is now, code quality for file browser is pretty low
anyway.

===================================================================

M	source/blender/editors/include/ED_fileselect.h
M	source/blender/editors/space_file/file_draw.c
M	source/blender/editors/space_file/file_ops.c
M	source/blender/editors/space_file/filesel.c
M	source/blender/editors/space_file/space_file.c

===================================================================

diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h
index 7273f857a41..12e75ba872f 100644
--- a/source/blender/editors/include/ED_fileselect.h
+++ b/source/blender/editors/include/ED_fileselect.h
@@ -37,6 +37,7 @@ struct wmWindowManager;
 #define MAX_FILE_COLUMN 4
 
 typedef enum FileListColumns {
+  COLUMN_NONE = -1,
   COLUMN_NAME = 0,
   COLUMN_DATE,
   COLUMN_TIME,
@@ -45,6 +46,8 @@ typedef enum FileListColumns {
 
 typedef struct FileLayout {
   /* view settings - XXX - move into own struct */
+  int offset_top;
+  int columnheader_h;
   int prv_w;
   int prv_h;
   int tile_w;
@@ -61,6 +64,7 @@ typedef struct FileLayout {
   int dirty;
   int textheight;
   float column_widths[MAX_FILE_COLUMN];
+  const char *column_names[MAX_FILE_COLUMN];
 
   /* When we change display size, we may have to update static strings like size of files... */
   short curr_size;
@@ -72,6 +76,7 @@ typedef struct FileSelection {
 } FileSelection;
 
 struct rcti;
+struct View2D;
 
 struct FileSelectParams *ED_fileselect_get_params(struct SpaceFile *sfile);
 
@@ -87,6 +92,17 @@ int ED_fileselect_layout_numfiles(FileLayout *layout, struct ARegion *ar);
 int ED_fileselect_layout_offset(FileLayout *layout, int x, int y);
 FileSelection ED_fileselect_layout_offset_rect(FileLayout *layout, const struct rcti *rect);
 
+void ED_fileselect_layout_maskrect(const FileLayout *layout,
+                                   const struct View2D *v2d,
+                                   struct rcti *r_rect);
+bool ED_fileselect_layout_is_inside_pt(const FileLayout *layout,
+                                       const struct View2D *v2d,
+                                       int x,
+                                       int y);
+bool ED_fileselect_layout_isect_rect(const FileLayout *layout,
+                                     const struct View2D *v2d,
+                                     const struct rcti *rect,
+                                     struct rcti *r_dst);
 void ED_fileselect_layout_tilepos(FileLayout *layout, int tile, int *x, int *y);
 
 void ED_operatormacros_file(void);
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index b79a867e58e..4471c9a16a5 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -618,9 +618,9 @@ static void draw_background(FileLayout *layout, View2D *v2d)
   immUniformThemeColorShade(TH_BACK, -7);
 
   /* alternating flat shade background */
-  for (i = 0; (i <= layout->rows); i += 2) {
-    sy = (int)v2d->cur.ymax - i * (layout->tile_h + 2 * layout->tile_border_y) -
-         layout->tile_border_y;
+  for (i = 2; (i <= layout->rows + 1); i += 2) {
+    sy = (int)v2d->cur.ymax - layout->offset_top -
+         i * (layout->tile_h + 2 * layout->tile_border_y) - layout->tile_border_y;
 
     immRectf(pos,
              v2d->cur.xmin,
@@ -685,6 +685,127 @@ static void draw_dividers(FileLayout *layout, View2D *v2d)
   }
 }
 
+static void draw_columnheader_background(const FileLayout *layout, const View2D *v2d)
+{
+  uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
+  immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+  immUniformThemeColorShade(TH_BACK, 7);
+
+  immRectf(
+      pos, v2d->cur.xmin, v2d->cur.ymax - layout->columnheader_h, v2d->cur.xmax, v2d->cur.ymax);
+
+  immUnbindProgram();
+}
+
+static bool filelist_column_matches_sort(const FileSelectParams *params, FileListColumns column)
+{
+  switch (params->sort) {
+    case FILE_SORT_ALPHA:
+      return column == COLUMN_NAME;
+    case FILE_SORT_SIZE:
+      return column == COLUMN_SIZE;
+    case FILE_SORT_TIME:
+      return column == COLUMN_DATE;
+  }
+
+  return false;
+}
+
+static bool filelist_column_enabled(const FileSelectParams *params, FileListColumns column)
+{
+  if (params->display == FILE_SHORTDISPLAY) {
+    return ELEM(column, COLUMN_NAME, COLUMN_SIZE);
+  }
+  else if (params->display == FILE_LONGDISPLAY) {
+    return true;
+  }
+
+  return false;
+}
+
+static void draw_columnheader_columns(const FileSelectParams *params,
+                                      FileLayout *layout,
+                                      const View2D *v2d,
+                                      const uchar text_col[4])
+{
+  const float divider_pad = 0.2 * layout->columnheader_h;
+  const int column_space = 0.6f * UI_UNIT_X;
+  FileListColumns last_col = COLUMN_NONE;
+  int sx = 0, sy = 0;
+  int ofs_x;
+
+  /* To get x position matching item drawing. */
+  ED_fileselect_layout_tilepos(layout, 0, &ofs_x, &sy);
+  //  sx += ofs_x;
+  sy = v2d->cur.ymax;
+
+  for (int column_idx = MAX_FILE_COLUMN - 1; column_idx >= 0; column_idx--) {
+    if (!filelist_column_enabled(params, column_idx)) {
+      continue;
+    }
+
+    last_col = column_idx;
+    break;
+  }
+  BLI_assert(last_col != COLUMN_NONE);
+
+  for (int column_idx = 0; column_idx < MAX_FILE_COLUMN; column_idx++) {
+    if (!filelist_column_enabled(params, column_idx)) {
+      continue;
+    }
+
+    file_draw_string(sx + ofs_x,
+                     sy,
+                     layout->column_names[column_idx],
+                     layout->column_widths[column_idx],
+                     layout->columnheader_h,
+                     UI_STYLE_TEXT_LEFT,
+                     text_col);
+
+    sx += layout->column_widths[column_idx] + column_space;
+
+    /* Active sort type triangle */
+    if (filelist_column_matches_sort(params, column_idx)) {
+      float tri_color[4];
+
+      rgba_uchar_to_float(tri_color, text_col);
+      UI_draw_icon_tri(sx - ofs_x - 0.15f * U.widget_unit,
+                       sy + (0.1f * U.widget_unit) - layout->columnheader_h / 2,
+                       'v',
+                       tri_color);
+    }
+
+    /* Separator line */
+    if (column_idx != last_col) {
+      uint pos = GPU_vertformat_attr_add(
+          immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
+      immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+      immUniformThemeColorShade(TH_BACK, -10);
+      immBegin(GPU_PRIM_LINES, 2);
+      immVertex2f(pos, sx - 1, sy - divider_pad);
+      immVertex2f(pos, sx - 1, sy - layout->columnheader_h + divider_pad);
+      immEnd();
+      immUnbindProgram();
+    }
+  }
+
+  /* Vertical separator lines line */
+  {
+    uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+    immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+    immUniformThemeColorShade(TH_BACK, -10);
+    immBegin(GPU_PRIM_LINES, 4);
+    immVertex2f(pos, v2d->cur.xmin, sy);
+    immVertex2f(pos, v2d->cur.xmax, sy);
+    immVertex2f(pos, v2d->cur.xmin, sy - layout->columnheader_h);
+    immVertex2f(pos, v2d->cur.xmax, sy - layout->columnheader_h);
+    immEnd();
+    immUnbindProgram();
+  }
+}
+
 void file_draw_list(const bContext *C, ARegion *ar)
 {
   SpaceFile *sfile = CTX_wm_space_file(C);
@@ -709,14 +830,13 @@ void file_draw_list(const bContext *C, ARegion *ar)
   unsigned char text_col[4];
   const bool small_size = SMALL_SIZE_CHECK(params->thumbnail_size);
   const bool update_stat_strings = small_size != SMALL_SIZE_CHECK(layout->curr_size);
+  const bool draw_columnheader = (params->display == FILE_SHORTDISPLAY);
   const float thumb_icon_aspect = sqrtf(64.0f / (float)(params->thumbnail_size));
 
   numfiles = filelist_files_ensure(files);
 
   if (params->display != FILE_IMGDISPLAY) {
-
     draw_background(layout, v2d);
-
     draw_dividers(layout, v2d);
   }
 
@@ -772,11 +892,16 @@ void file_draw_list(const bContext *C, ARegion *ar)
 
   BLF_batch_draw_begin();
 
+  UI_GetThemeColor4ubv(TH_TEXT, text_col);
+
   for (i = offset; (i < numfiles) && (i < offset + numfiles_layout); i++) {
     unsigned int file_selflag;
     char path[FILE_MAX_LIBEXTRA];
+    int padx = 0.1f * UI_UNIT_X;
+    int icon_ofs = 0;
+
     ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
-    sx += (int)(v2d->tot.xmin + 0.1f * UI_UNIT_X);
+    sx += (int)(v2d->tot.xmin + padx);
     sy = (int)(v2d->tot.ymax - sy);
 
     file = filelist_file(files, i);
@@ -790,15 +915,14 @@ void file_draw_list(const bContext *C, ARegion *ar)
         int colorid = (file_selflag & FILE_SEL_SELECTED) ? TH_HILITE : TH_BACK;
         int shade = (params->highlight_file == i) || (file_selflag & FILE_SEL_HIGHLIGHTED) ? 35 :
                                                                                              0;
+        const short width = ELEM(params->display, FILE_SHORTDISPLAY, FILE_LONGDISPLAY) ?
+                                layout->tile_w - (2 * padx) :
+                                layout->tile_w;
 
         BLI_assert(i == 0 || !FILENAME_IS_CURRPAR(file->relpath));
 
-        draw_tile(sx,
-                  sy - 1,
-                  layout->tile_w + 4,
-                  sfile->layout->tile_h + layout->tile_border_y,
-                  colorid,
-                  shade);
+        draw_tile(
+            sx, sy - 1, width, sfile->layout->tile_h + layout->tile_border_y, colorid, shade);
       }
     }
     UI_draw_roundbox_corner_set(UI_CNR_NONE);
@@ -836,20 +960,18 @@ void file_draw_list(const bContext *C, ARegion *ar)
                      ICON_DEFAULT_WIDTH_SCALE,
                      ICON_DEFAULT_HEIGHT_SCALE,
                      do_drag);
-      sx += ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X;
+      icon_ofs += ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X;
     }
 
-    UI_GetThemeColor4ubv(TH_TEXT, text_col);
-
     if (file_selflag & FILE_SEL_EDITING) {
       uiBut *but;
       short width;
 
       if (params->display == FILE_SHORTDISPLAY) {
-        width = layout->tile_w - (ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X);
+        width = layout->tile_w - 2 * padx;
       }
       else if (params->display == FILE_LONGDISPLAY) {
-        width = layout->column_widths[COLUMN_NAME] + (column_space * 3.5f);
+        width = layout->column_widths[COLUMN_NAME] + column_space - 2 * padx;
       }
       else {
         BLI_assert(params->display == FILE_IMGDISPLAY);
@@ -860,9 +982,9 @@ void file_draw_list(const bContext *C, ARegion *ar)
       

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list