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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs