Commit: 4e3cfaeb163315cc5675281a5a703d8c0f1793c4
Author: Julian Eisel
Date:   Tue Feb 7 00:45:33 2017 +0100
Branches: uiTable
https://developer.blender.org/rB4e3cfaeb163315cc5675281a5a703d8c0f1793c4

Unit tests for uiTable API (and fix bugs found using it :)

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

M       source/blender/editors/include/UI_table.h
M       source/blender/editors/interface/table.c
M       tests/gtests/CMakeLists.txt
A       tests/gtests/interface/CMakeLists.txt
A       tests/gtests/interface/UI_table_test.cc

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

diff --git a/source/blender/editors/include/UI_table.h 
b/source/blender/editors/include/UI_table.h
index ca1220198d..9524616aa3 100644
--- a/source/blender/editors/include/UI_table.h
+++ b/source/blender/editors/include/UI_table.h
@@ -41,6 +41,11 @@ enum uiTableColumnAlignemt {
        TABLE_COLUMN_ALIGN_RIGHT,
 };
 
+enum uiTableUnit {
+       TABLE_UNIT_PX,
+       TABLE_UNIT_PERCENT,
+};
+
 
 uiTable *UI_table_horizontal_flow_create(void) ATTR_WARN_UNUSED_RESULT;
 uiTable *UI_table_vertical_flow_create(void) ATTR_WARN_UNUSED_RESULT;
@@ -55,14 +60,13 @@ uiTableColumn *UI_table_column_add(uiTable *table, const 
char *idname, const cha
                                    uiTableCellDrawFunc cell_draw) 
ATTR_NONNULL(1, 2);
 void UI_table_column_remove(uiTable *table, uiTableColumn *column) 
ATTR_NONNULL();
 uiTableColumn *UI_table_column_lookup(uiTable *table, const char *idname) 
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
-void UI_table_column_width_set(uiTableColumn *col, const uiTableSize width, 
const int min_width_px) ATTR_NONNULL();
+void UI_table_column_width_set(uiTableColumn *column, const unsigned int 
width, enum uiTableUnit unit,
+                               const int min_width_px) ATTR_NONNULL();
 void UI_table_column_alignment_set(uiTableColumn *column, enum 
uiTableColumnAlignemt alignment) ATTR_NONNULL();
 /* *** Rows *** */
 uiTableRow *UI_table_row_add(uiTable *table, void *rowdata) ATTR_NONNULL(1);
 void UI_table_row_height_set(uiTable *table, uiTableRow *row, unsigned int 
height) ATTR_NONNULL();
 
-uiTableSize UI_table_size_px(const int value);
-uiTableSize UI_table_size_percentage(const int value);
 unsigned int UI_table_get_rowcount(const uiTable *table);
 
 #endif /* __UI_TABLE_H__ */
diff --git a/source/blender/editors/interface/table.c 
b/source/blender/editors/interface/table.c
index d2a977677d..94420613ea 100644
--- a/source/blender/editors/interface/table.c
+++ b/source/blender/editors/interface/table.c
@@ -69,10 +69,7 @@ typedef struct TableHorizontalFlow {
  * for size properties (only column widths right now).
  */
 typedef struct uiTableSize {
-       enum {
-               TABLE_UNIT_PX,
-               TABLE_UNIT_PERCENT,
-       } unit;
+       enum uiTableUnit unit;
        int value;
 } uiTableSize;
 
@@ -154,15 +151,24 @@ static void table_row_height_set(uiTable *table, 
uiTableRow *row, unsigned int h
        }
 }
 
-static unsigned int table_get_tot_width_unfixed_columns(const uiTable *table)
+static unsigned int table_column_width_clamp(const uiTableColumn *column, 
const unsigned int maxwidth,
+                                             const unsigned int 
unclamped_width)
+{
+       unsigned int width = unclamped_width;
+       CLAMP(width, column->min_width, maxwidth);
+       return width;
+}
+
+static unsigned int table_calc_tot_width_unfixed_columns(const uiTable *table)
 {
        unsigned int nonfixed_width = table->max_width;
 
        TABLE_COLUMNS_ITER_BEGIN(table, column)
        {
                if (column->width.unit == TABLE_UNIT_PX) {
-                       BLI_assert(nonfixed_width - column->width.value > 0);
-                       nonfixed_width -= column->width.value;
+                       unsigned int width = table_column_width_clamp(column, 
table->max_width, column->width.value);
+                       BLI_assert(nonfixed_width >= width);
+                       nonfixed_width -= width;
                }
        }
        TABLE_COLUMNS_ITER_END;
@@ -174,22 +180,23 @@ static struct TableColumnDrawInfo 
table_column_drawinfo_init(const uiTable *tabl
 {
        struct TableColumnDrawInfo drawinfo = {};
 
-       drawinfo.totwidth_nonfixed = table_get_tot_width_unfixed_columns(table);
+       drawinfo.totwidth_nonfixed = 
table_calc_tot_width_unfixed_columns(table);
        BLI_assert(drawinfo.totwidth_nonfixed <= table->max_width);
 
        return drawinfo;
 }
 
-static unsigned int table_column_calc_width(const uiTableColumn *column, const 
struct TableColumnDrawInfo *drawinfo)
+static unsigned int table_column_calc_width(const uiTableColumn *column, const 
struct TableColumnDrawInfo *drawinfo,
+                                            const unsigned int maxwidth)
 {
        unsigned int width = column->width.value;
 
        if (column->width.unit == TABLE_UNIT_PERCENT) {
+               CLAMP_MAX(width, 100); /* more than 100% doesn't make sense */
                width = iroundf(width * 0.01f * drawinfo->totwidth_nonfixed);
        }
-       width = MAX2(column->min_width, width);
 
-       return width;
+       return table_column_width_clamp(column, maxwidth, width);
 }
 
 /**
@@ -200,7 +207,7 @@ static void table_column_calc_x_coords(const uiTableColumn 
*column, const float
                                        struct TableColumnDrawInfo *io_drawinfo,
                                        int *r_xmin, int *r_xmax)
 {
-       const unsigned int width = table_column_calc_width(column, io_drawinfo);
+       const unsigned int width = table_column_calc_width(column, io_drawinfo, 
max_width);
 
        if (column->alignment == TABLE_COLUMN_ALIGN_LEFT) {
                *r_xmin = io_drawinfo->totwidth_left;
@@ -217,11 +224,18 @@ static void table_column_calc_x_coords(const 
uiTableColumn *column, const float
        }
 }
 
-static void table_row_calc_y_coords(uiTableRow *row, const unsigned int ofs_y, 
int *r_ymin, int *r_ymax)
+static void table_row_calc_y_coords(uiTable *table, uiTableRow *row, const 
unsigned int ofs_y, int *r_ymin, int *r_ymax)
 {
+       unsigned int height = row->height;
+
+       if (table->flow_direction == TABLE_FLOW_HORIZONTAL) {
+               TableHorizontalFlow *horizontal_table = (TableHorizontalFlow 
*)table;
+               CLAMP_MAX(height, horizontal_table->max_height);
+       }
+
        /* Assuming inverted direction, from top to bottom. */
        *r_ymax = -ofs_y;
-       *r_ymin = *r_ymax - row->height;
+       *r_ymin = *r_ymax - height;
 }
 
 
@@ -297,7 +311,7 @@ uiTableColumn *UI_table_column_add(uiTable *table, const 
char *idname, const cha
        col->drawname = drawname;
        col->cell_draw = cell_draw;
        col->alignment = TABLE_COLUMN_ALIGN_LEFT;
-       UI_table_column_width_set(col, UI_table_size_percentage(100), 0);
+       UI_table_column_width_set(col, 100, TABLE_UNIT_PERCENT, 0);
 
        BLI_addtail(&table->columns, col);
 
@@ -326,11 +340,13 @@ uiTableColumn *UI_table_column_lookup(uiTable *table, 
const char *idname)
 /**
  * Set the size info for \a col.
  * \param width: The width in either pixels (#UI_table_size_px), or percentage 
(#UI_table_size_percentage).
+ * \param min_width_px: Minimum width for the column (always in px).
  */
-void UI_table_column_width_set(uiTableColumn *column, const uiTableSize width, 
const int min_width_px)
+void UI_table_column_width_set(uiTableColumn *column, const unsigned int 
width, enum uiTableUnit unit,
+                               const int min_width_px)
 {
-       BLI_assert(width.value >= 0);
-       column->width = width;
+       column->width.unit = unit;
+       column->width.value = width;
        column->min_width = min_width_px;
 }
 
@@ -371,11 +387,10 @@ void UI_table_draw(uiTable *table)
        } flow_table = {table};
 
        struct TableColumnDrawInfo column_drawinfo = 
table_column_drawinfo_init(table);
-       unsigned int xofs = 0, yofs = 0;
        BLI_mempool_iter iter;
+       unsigned int xofs = 0, yofs = 0;
 
 
-       BLI_mempool_iternew(table->row_pool, &iter);
        TABLE_COLUMNS_ITER_BEGIN(table, column)
        {
                int prev_row_height = -1; /* to check if rows have consistent 
height */
@@ -384,6 +399,7 @@ void UI_table_draw(uiTable *table)
 
                table_column_calc_x_coords(column, table->max_width, 
&column_drawinfo, &drawrect.xmin, &drawrect.xmax);
 
+               BLI_mempool_iternew(table->row_pool, &iter);
                for (uiTableRow *row = BLI_mempool_iterstep(&iter); row; row = 
BLI_mempool_iterstep(&iter)) {
                        /* check for consistent row height */
                        if ((prev_row_height >= 0) && (row->height != 
prev_row_height)) {
@@ -395,7 +411,7 @@ void UI_table_draw(uiTable *table)
                                yofs = 0;
                        }
 
-                       table_row_calc_y_coords(row, yofs, &drawrect.ymin, 
&drawrect.ymax);
+                       table_row_calc_y_coords(table, row, yofs, 
&drawrect.ymin, &drawrect.ymax);
                        column->cell_draw(row->rowdata, drawrect);
 
                        yofs += row->height;
@@ -415,18 +431,6 @@ void UI_table_draw(uiTable *table)
        TABLE_COLUMNS_ITER_END;
 }
 
-uiTableSize UI_table_size_px(const int value)
-{
-       uiTableSize size = {.unit = TABLE_UNIT_PX, .value = value};
-       return size;
-}
-
-uiTableSize UI_table_size_percentage(const int value)
-{
-       uiTableSize size = {.unit = TABLE_UNIT_PERCENT, .value = value};
-       return size;
-}
-
 unsigned int UI_table_get_rowcount(const uiTable *table)
 {
        return BLI_mempool_count(table->row_pool);
diff --git a/tests/gtests/CMakeLists.txt b/tests/gtests/CMakeLists.txt
index a3860ce3e6..ae3129fc23 100644
--- a/tests/gtests/CMakeLists.txt
+++ b/tests/gtests/CMakeLists.txt
@@ -10,6 +10,7 @@ if(WITH_GTESTS)
        add_subdirectory(testing)
        add_subdirectory(blenlib)
        add_subdirectory(guardedalloc)
+       add_subdirectory(interface)
        add_subdirectory(bmesh)
 endif()
 
diff --git a/tests/gtests/interface/CMakeLists.txt 
b/tests/gtests/interface/CMakeLists.txt
new file mode 100644
index 0000000000..d279f1675a
--- /dev/null
+++ b/tests/gtests/interface/CMakeLists.txt
@@ -0,0 +1,44 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+set(INC
+       .
+       ..
+       ../../../source/blender/blenlib
+       ../../../source/blender/editors/include
+       ../../../source/blender/makesdna
+)
+
+include_directories(${INC})
+
+setup_libdirs()
+get_property(BLENDER_SORTED_LIBS GLOBAL PROPERTY BLENDER_SORTED_LIBS_PROP)
+
+# Current BLENDER_SORTED_LIBS works with starting list of symbols in creator, 
but not
+# for this test. Doubling the list does let all the symbols be resolved, but 
link time is a bit painful.
+set(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} ${BLENDER_SORTED_LIBS})
+
+if(WITH_BUILDINFO)
+       set(_buildinfo_src "$<TARGET_OBJECTS:buildinfoobj>")

@@ 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

Reply via email to