diff --git a/misc/api/design-rendering-cycle.ngdoc b/misc/api/design-rendering-cycle.ngdoc index 25a5cc14d4..a0a6feb4df 100644 --- a/misc/api/design-rendering-cycle.ngdoc +++ b/misc/api/design-rendering-cycle.ngdoc @@ -44,8 +44,7 @@ appears to be to accomodate filters. The style builders include: -- `GridRenderContainer`, which appears to currently apply no styles -- `uiGrid.updateColumnWidths`, which calculates column widths based on the defined settings, including resolving * and ** etc. No rendering +- `GridRenderContainer.updateColumnWidths`, which calculates column widths based on the defined settings, including resolving * and ** etc. No rendering is involved - all based on the availableWidth. This may be the source of some of the iteration - because availableWidth must in some way be based on columnWidth - the canvas doesn't really have an available width. I also have question on why we calculate widths on the grid and not on the renderContainer, that may be another source of iteration. Having said that, things like % and * probably apply to the @@ -54,6 +53,7 @@ The style builders include: width of each column in the render container, and the width of the overall render container. - `Grid.prototype.getFooterStyles()`, sets the columnFooterHeight and the gridFooterHeight based on fixed values declared in the options - when there are multiple renderContainers (e.g. a left container), the non-body render containers appear to execute first +- `ui-pinned-container.updateContainerDimensions()`: sets the width of a pinned container. How does this interact with render container width? ### Vision The vision is to make the style calculations more deterministic, and remove any iteration or other dependencies. A single pass through diff --git a/misc/tutorial/204_column_resizing.ngdoc b/misc/tutorial/204_column_resizing.ngdoc index 95e19bf1c2..f5e19c20e4 100644 --- a/misc/tutorial/204_column_resizing.ngdoc +++ b/misc/tutorial/204_column_resizing.ngdoc @@ -4,7 +4,17 @@ The Resize Columns feature allows each column to be resized. -To enable, you must include the 'ui.grid.resizeColumns' module and you must include the ui-grid-resize-columns directive on your grid element. +To enable, you must include the 'ui.grid.resizeColumns' module and you must include the ui-grid-resize-columns directive +on your grid element. + +You can set individual columns to not be resizeable, if you do this it is recommended that those columns have a fixed +pixel width - otherwise they may get automatically resized to fill the remaining space if other columns are reduced in size, +and there will be no way to reduce their width again. + +When you resize a column any other columns with fixed widths, or that have already been resized, retain their width. All other +columns resize to take up the remaining space. As long as there is at least one variable column left your columns won't reduce +below the full grid width - but once you've resized all the columns then you can end up with the total column width less than the +grid width.
angular.module('yourApp', ['ui.grid', 'ui.grid.resizeColumns']); @@ -45,7 +55,7 @@ $scope.gridOptions = { $scope.gridOptions = { enableSorting: true, columnDefs: [ - { field: 'name', minWidth: 200, width: '50%', enableColumnResizing: false }, + { field: 'name', minWidth: 200, width: 250, enableColumnResizing: false }, { field: 'gender', width: '30%', maxWidth: 200, minWidth: 70 }, { field: 'company', width: '20%' } ] diff --git a/src/features/pinning/js/pinning.js b/src/features/pinning/js/pinning.js index d357a73c14..19c92fac6a 100644 --- a/src/features/pinning/js/pinning.js +++ b/src/features/pinning/js/pinning.js @@ -89,9 +89,6 @@ col.grid.refresh() .then(function () { col.renderContainer = 'left'; - // Need to calculate the width. If col.drawnWidth is used instead then the width - // will be 100% if it's the first column, 50% if it's the second etc. - col.width = col.grid.canvasWidth / col.grid.columns.length; col.grid.createLeftContainer(); }); } @@ -106,9 +103,6 @@ col.grid.refresh() .then(function () { col.renderContainer = 'right'; - // Need to calculate the width. If col.drawnWidth is used instead then the width - // will be 100% if it's the first column, 50% if it's the second etc. - col.width = col.grid.canvasWidth / col.grid.columns.length; col.grid.createRightContainer(); }); } @@ -134,12 +128,7 @@ this.context.col.width = this.context.col.drawnWidth; this.context.col.grid.createLeftContainer(); - // Need to call refresh twice; once to move our column over to the new render container and then - // a second time to update the grid viewport dimensions with our adjustments - col.grid.refresh() - .then(function () { - col.grid.refresh(); - }); + col.grid.refresh(); } }; @@ -155,13 +144,7 @@ this.context.col.width = this.context.col.drawnWidth; this.context.col.grid.createRightContainer(); - - // Need to call refresh twice; once to move our column over to the new render container and then - // a second time to update the grid viewport dimensions with our adjustments - col.grid.refresh() - .then(function () { - col.grid.refresh(); - }); + col.grid.refresh(); } }; @@ -175,12 +158,7 @@ action: function () { this.context.col.renderContainer = null; - // Need to call refresh twice; once to move our column over to the new render container and then - // a second time to update the grid viewport dimensions with our adjustments - col.grid.refresh() - .then(function () { - col.grid.refresh(); - }); + col.grid.refresh(); } }; diff --git a/src/features/resize-columns/js/ui-grid-column-resizer.js b/src/features/resize-columns/js/ui-grid-column-resizer.js index 26776bc988..f1bab9fafe 100644 --- a/src/features/resize-columns/js/ui-grid-column-resizer.js +++ b/src/features/resize-columns/js/ui-grid-column-resizer.js @@ -328,22 +328,6 @@ $elm.addClass('right'); } - // Resize all the other columns around col - function resizeAroundColumn(col) { - // Get this column's render container - var renderContainer = col.getRenderContainer(); - - renderContainer.visibleColumnCache.forEach(function (column) { - // Skip the column we just resized - if (column === col) { return; } - - var colDef = column.colDef; - if (!colDef.width || (angular.isString(colDef.width) && (colDef.width.indexOf('*') !== -1 || colDef.width.indexOf('%') !== -1))) { - column.width = column.drawnWidth; - } - }); - } - // Build the columns then refresh the grid canvas // takes an argument representing the diff along the X-axis that the resize had function buildColumnsAndRefresh(xDiff) { @@ -440,9 +424,6 @@ // check we're not outside the allowable bounds for this column col.width = constrainWidth(col, newWidth); - // All other columns because fixed to their drawn width, if they aren't already - resizeAroundColumn(col); - buildColumnsAndRefresh(xDiff); uiGridResizeColumnsService.fireColumnSizeChanged(uiGridCtrl.grid, col.colDef, xDiff); @@ -527,9 +508,6 @@ // check we're not outside the allowable bounds for this column col.width = constrainWidth(col, maxWidth); - // All other columns because fixed to their drawn width, if they aren't already - resizeAroundColumn(col); - buildColumnsAndRefresh(xDiff); uiGridResizeColumnsService.fireColumnSizeChanged(uiGridCtrl.grid, col.colDef, xDiff); diff --git a/src/js/core/directives/ui-grid-header.js b/src/js/core/directives/ui-grid-header.js index 149c646f3d..6bcc74f655 100644 --- a/src/js/core/directives/ui-grid-header.js +++ b/src/js/core/directives/ui-grid-header.js @@ -81,118 +81,22 @@ gridUtil.disableAnimations($elm); function updateColumnWidths() { - // Get the width of the viewport - var availableWidth = containerCtrl.colContainer.getViewportWidth() - grid.scrollbarWidth; - - //if (typeof(uiGridCtrl.grid.verticalScrollbarWidth) !== 'undefined' && uiGridCtrl.grid.verticalScrollbarWidth !== undefined && uiGridCtrl.grid.verticalScrollbarWidth > 0) { - // availableWidth = availableWidth + uiGridCtrl.grid.verticalScrollbarWidth; - //} - - // The total number of columns - // var equalWidthColumnCount = columnCount = uiGridCtrl.grid.options.columnDefs.length; - // var equalWidth = availableWidth / equalWidthColumnCount; - - var columnCache = containerCtrl.colContainer.visibleColumnCache, - canvasWidth = 0, - asteriskNum = 0, - oneAsterisk = 0, - leftoverWidth = availableWidth, - hasVariableWidth = false; - - var getColWidth = function(column){ - if (column.widthType === "manual"){ - return +column.width; - } - else if (column.widthType === "percent"){ - return parseInt(column.width.replace(/%/g, ''), 10) * availableWidth / 100; - } - else if (column.widthType === "auto"){ - // leftOverWidth is subtracted from after each call to this - // function so we need to calculate oneAsterisk size only once - if (oneAsterisk === 0) { - oneAsterisk = parseInt(leftoverWidth / asteriskNum, 10); - } - return column.width.length * oneAsterisk; - } - }; - - // Populate / determine column width types: - columnCache.forEach(function(column){ - column.widthType = null; - if (isFinite(+column.width)){ - column.widthType = "manual"; - } - else if (gridUtil.endsWith(column.width, "%")){ - column.widthType = "percent"; - hasVariableWidth = true; - } - else if (angular.isString(column.width) && column.width.indexOf('*') !== -1){ - column.widthType = "auto"; - asteriskNum += column.width.length; - hasVariableWidth = true; - } - }); - - // For sorting, calculate width from first to last: - var colWidthPriority = ["manual", "percent", "auto"]; - columnCache.filter(function(column){ - // Only draw visible items with a widthType - return (column.visible && column.widthType); - }).sort(function(a,b){ - // Calculate widths in order, so that manual comes first, etc. - return colWidthPriority.indexOf(a.widthType) - colWidthPriority.indexOf(b.widthType); - }).forEach(function(column){ - // Calculate widths: - var colWidth = getColWidth(column); - if (column.minWidth){ - colWidth = Math.max(colWidth, column.minWidth); - } - if (column.maxWidth){ - colWidth = Math.min(colWidth, column.maxWidth); - } - column.drawnWidth = Math.floor(colWidth); - canvasWidth += column.drawnWidth; - leftoverWidth -= column.drawnWidth; - }); - - // If the grid width didn't divide evenly into the column widths and we have pixels left over, dole them out to the columns one by one to make everything fit - if (hasVariableWidth && leftoverWidth > 0 && canvasWidth > 0 && canvasWidth < availableWidth) { - var remFn = function (column) { - if (leftoverWidth > 0 && (column.widthType === "auto" || column.widthType === "percent")) { - column.drawnWidth = column.drawnWidth + 1; - canvasWidth = canvasWidth + 1; - leftoverWidth--; - } - }; - var prevLeftover = 0; - do { - prevLeftover = leftoverWidth; - columnCache.forEach(remFn); - } while (leftoverWidth > 0 && leftoverWidth !== prevLeftover ); - } - canvasWidth = Math.max(canvasWidth, availableWidth); + // this styleBuilder always runs after the renderContainer, so we can rely on the column widths + // already being populated correctly + var columnCache = containerCtrl.colContainer.visibleColumnCache; + // Build the CSS // uiGridCtrl.grid.columns.forEach(function (column) { var ret = ''; + var canvasWidth = 0; columnCache.forEach(function (column) { ret = ret + column.getColClassDefinition(); + canvasWidth += column.drawnWidth; }); - // Add the vertical scrollbar width back in to the canvas width, it's taken out in getViewportWidth - //if (grid.verticalScrollbarWidth) { - // canvasWidth = canvasWidth + grid.verticalScrollbarWidth; - //} - // canvasWidth = canvasWidth + 1; - - // if we have a grid menu, then we prune the width of the last column header - // to allow room for the button whilst still getting to the column menu - if (columnCache.length > 0) { // && grid.options.enableGridMenu) { - columnCache[columnCache.length - 1].headerWidth = columnCache[columnCache.length - 1].drawnWidth - 30; - } - - containerCtrl.colContainer.canvasWidth = parseInt(canvasWidth, 10); - + containerCtrl.colContainer.canvasWidth = canvasWidth; + // Return the styles back to buildStyles which pops them into the `customStyles` scope variable return ret; } @@ -207,7 +111,7 @@ //todo: remove this if by injecting gridCtrl into unit tests if (uiGridCtrl) { uiGridCtrl.grid.registerStyleComputation({ - priority: 5, + priority: 15, func: updateColumnWidths }); } diff --git a/src/js/core/directives/ui-grid-render-container.js b/src/js/core/directives/ui-grid-render-container.js index 4b10cb4f2e..518a4b53a4 100644 --- a/src/js/core/directives/ui-grid-render-container.js +++ b/src/js/core/directives/ui-grid-render-container.js @@ -170,7 +170,7 @@ function update() { var ret = ''; - var canvasWidth = colContainer.getCanvasWidth(); + var canvasWidth = colContainer.canvasWidth; var viewportWidth = colContainer.getViewportWidth(); var canvasHeight = rowContainer.getCanvasHeight(); diff --git a/src/js/core/directives/ui-pinned-container.js b/src/js/core/directives/ui-pinned-container.js index 3ff5fd1b1f..7d3bd5859d 100644 --- a/src/js/core/directives/ui-pinned-container.js +++ b/src/js/core/directives/ui-pinned-container.js @@ -32,18 +32,16 @@ width += col.drawnWidth || col.width || 0; } - myWidth = width; + return width; } } function updateContainerDimensions() { - // gridUtil.logDebug('update ' + $scope.side + ' dimensions'); - var ret = ''; // Column containers if ($scope.side === 'left' || $scope.side === 'right') { - updateContainerWidth(); + myWidth = updateContainerWidth(); // gridUtil.logDebug('myWidth', myWidth); @@ -51,7 +49,7 @@ $elm.attr('style', null); var myHeight = grid.renderContainers.body.getViewportHeight(); // + grid.horizontalScrollbarHeight; - + ret += '.grid' + grid.id + ' .ui-grid-pinned-container-' + $scope.side + ', .grid' + grid.id + ' .ui-grid-pinned-container-' + $scope.side + ' .ui-grid-render-container-' + $scope.side + ' .ui-grid-viewport { width: ' + myWidth + 'px; height: ' + myHeight + 'px; } '; } @@ -59,9 +57,8 @@ } grid.renderContainers.body.registerViewportAdjuster(function (adjustment) { - if ( myWidth === 0 || !myWidth ){ - updateContainerWidth(); - } + myWidth = updateContainerWidth(); + // Subtract our own width adjustment.width -= myWidth; diff --git a/src/js/core/factories/GridRenderContainer.js b/src/js/core/factories/GridRenderContainer.js index 7c39c73545..d186dabfe0 100644 --- a/src/js/core/factories/GridRenderContainer.js +++ b/src/js/core/factories/GridRenderContainer.js @@ -68,14 +68,12 @@ angular.module('ui.grid') grid.registerStyleComputation({ priority: 5, func: function () { + self.updateColumnWidths(); return self.columnStyles; } }); } - // GridRenderContainer.prototype.addRenderable = function addRenderable(renderable) { - // this.renderables.push(renderable); - // }; GridRenderContainer.prototype.reset = function reset() { // this.rowCache.length = 0; @@ -268,10 +266,6 @@ angular.module('ui.grid') var ret = self.canvasWidth; - //if (typeof(self.verticalScrollbarWidth) !== 'undefined' && self.verticalScrollbarWidth !== undefined && self.verticalScrollbarWidth > 0) { - // ret = ret - self.verticalScrollbarWidth; - //} - return ret; }; @@ -481,210 +475,150 @@ angular.module('ui.grid') return null; }; + /** + * @ngdoc boolean + * @name updateColumnWidths + * @propertyOf ui.grid.class:GridRenderContainer + * @description Determine the appropriate column width of each column across all render containers. + * + * Column width is easy when each column has a specified width. When columns are variable width (i.e. + * have an * or % of the viewport) then we try to calculate so that things fit in. The problem is that + * we have multiple render containers, and we don't want one render container to just take the whole viewport + * when it doesn't need to - we want things to balance out across the render containers. + * + * To do this, we use this method to calculate all the renderContainers, recognising that in a given render + * cycle it'll get called once per render container, so it needs to return the same values each time. + * + * The constraints on this method are therefore: + * - must return the same value when called multiple times, to do this it needs to rely on properties of the + * columns, but not properties that change when this is called (so it shouldn't rely on drawnWidth) + * + * The general logic of this method is: + * - calculate our total available width + * - look at all the columns across all render containers, and work out which have widths and which have + * constraints such as % or * or something else + * - for those with *, count the total number of * we see and add it onto a running total, add this column to an * array + * - for those with a %, allocate the % as a percentage of the viewport, having consideration of min and max + * - for those with manual width (in pixels) we set the drawnWidth to the specified width + * - we end up with an asterisks array still to process + * - we look at our remaining width. If it's greater than zero, we divide it up among the asterisk columns, then process + * them for min and max width constraints + * - if it's zero or less, we set the asterisk columns to their minimum widths + * - we use parseInt quite a bit, as we try to make all our column widths integers + */ GridRenderContainer.prototype.updateColumnWidths = function () { var self = this; var asterisksArray = [], - percentArray = [], - manualArray = [], - asteriskNum = 0, - totalWidth = 0; + asteriskNum = 0, + usedWidthSum = 0, + ret = ''; // Get the width of the viewport - var availableWidth = self.getViewportWidth() - self.grid.scrollbarWidth; - - //if (typeof(self.grid.verticalScrollbarWidth) !== 'undefined' && self.grid.verticalScrollbarWidth !== undefined && self.grid.verticalScrollbarWidth > 0) { - // availableWidth = availableWidth + self.grid.verticalScrollbarWidth; - //} - - // The total number of columns - // var equalWidthColumnCount = columnCount = uiGridCtrl.grid.options.columnDefs.length; - // var equalWidth = availableWidth / equalWidthColumnCount; + var availableWidth = self.grid.getViewportWidth() - self.grid.scrollbarWidth; - // The last column we processed - var lastColumn; - - var manualWidthSum = 0; - - var canvasWidth = 0; - - var ret = ''; - - - // uiGridCtrl.grid.columns.forEach(function(column, i) { - - var columnCache = self.visibleColumnCache; + // get all the columns across all render containers, we have to calculate them all or one render container + // could consume the whole viewport + var columnCache = []; + angular.forEach(self.grid.renderContainers, function( container, name){ + columnCache = columnCache.concat(container.visibleColumnCache); + }); + // look at each column, process any manual values or %, put the * into an array to look at later columnCache.forEach(function(column, i) { - // ret = ret + ' .grid' + uiGridCtrl.grid.id + ' .col' + i + ' { width: ' + equalWidth + 'px; left: ' + left + 'px; }'; - //var colWidth = (typeof(c.width) !== 'undefined' && c.width !== undefined) ? c.width : equalWidth; - + var width = 0; // Skip hidden columns if (!column.visible) { return; } - var colWidth, - isPercent = false; - - if (!angular.isNumber(column.width)) { - isPercent = isNaN(column.width) && gridUtil.endsWith(column.width, "%"); - } - - if (angular.isString(column.width) && column.width.indexOf('*') !== -1) { // we need to save it until the end to do the calulations on the remaining width. - asteriskNum = parseInt(asteriskNum + column.width.length, 10); + if (angular.isNumber(column.width)) { + // pixel width, set to this value + width = parseInt(column.width, 10); + usedWidthSum = usedWidthSum + width; + column.drawnWidth = width; - asterisksArray.push(column); - } - else if (isPercent) { // If the width is a percentage, save it until the very last. - percentArray.push(column); - } - else if (angular.isNumber(column.width)) { - manualWidthSum = parseInt(manualWidthSum + column.width, 10); + } else if (gridUtil.endsWith(column.width, "%")) { + // percentage width, set to percentage of the viewport + width = parseInt(parseInt(column.width.replace(/%/g, ''), 10) / 100 * availableWidth); - canvasWidth = parseInt(canvasWidth, 10) + parseInt(column.width, 10); - - column.drawnWidth = column.width; - } - }); - - // Get the remaining width (available width subtracted by the manual widths sum) - var remainingWidth = availableWidth - manualWidthSum; - - var i, column, colWidth; - - if (percentArray.length > 0) { - // Pre-process to make sure they're all within any min/max values - for (i = 0; i < percentArray.length; i++) { - column = percentArray[i]; - - var percent = parseInt(column.width.replace(/%/g, ''), 10) / 100; - - colWidth = parseInt(percent * remainingWidth, 10); - - if (column.colDef.minWidth && colWidth < column.colDef.minWidth) { - colWidth = column.colDef.minWidth; - - remainingWidth = remainingWidth - colWidth; - - canvasWidth += colWidth; - column.drawnWidth = colWidth; - - // Remove this element from the percent array so it's not processed below - percentArray.splice(i, 1); + if ( width > column.maxWidth ){ + width = column.maxWidth; } - else if (column.colDef.maxWidth && colWidth > column.colDef.maxWidth) { - colWidth = column.colDef.maxWidth; - - remainingWidth = remainingWidth - colWidth; - - canvasWidth += colWidth; - column.drawnWidth = colWidth; - - // Remove this element from the percent array so it's not processed below - percentArray.splice(i, 1); + + if ( width < column.minWidth ){ + width = column.minWidth; } + + usedWidthSum = usedWidthSum + width; + column.drawnWidth = width; + } else if (angular.isString(column.width) && column.width.indexOf('*') !== -1) { + // is an asterisk column, the gridColumn already checked the string consists only of '****' + asteriskNum = asteriskNum + column.width.length; + asterisksArray.push(column); } + }); - percentArray.forEach(function(column) { - var percent = parseInt(column.width.replace(/%/g, ''), 10) / 100; - var colWidth = parseInt(percent * remainingWidth, 10); - - canvasWidth += colWidth; + // Get the remaining width (available width subtracted by the used widths sum) + var remainingWidth = availableWidth - usedWidthSum; - column.drawnWidth = colWidth; - }); - } + var i, column, colWidth; if (asterisksArray.length > 0) { - var asteriskVal = parseInt(remainingWidth / asteriskNum, 10); - - // Pre-process to make sure they're all within any min/max values - for (i = 0; i < asterisksArray.length; i++) { - column = asterisksArray[i]; - - colWidth = parseInt(asteriskVal * column.width.length, 10); - - if (column.colDef.minWidth && colWidth < column.colDef.minWidth) { - colWidth = column.colDef.minWidth; + // the width that each asterisk value would be assigned (this can be negative) + var asteriskVal = remainingWidth / asteriskNum; - remainingWidth = remainingWidth - colWidth; - asteriskNum--; + asterisksArray.forEach(function( column ){ + var width = parseInt(column.width.length * asteriskVal, 10); - canvasWidth += colWidth; - column.drawnWidth = colWidth; - - lastColumn = column; - - // Remove this element from the percent array so it's not processed below - asterisksArray.splice(i, 1); + if ( width > column.maxWidth ){ + width = column.maxWidth; } - else if (column.colDef.maxWidth && colWidth > column.colDef.maxWidth) { - colWidth = column.colDef.maxWidth; - - remainingWidth = remainingWidth - colWidth; - asteriskNum--; - - canvasWidth += colWidth; - column.drawnWidth = colWidth; - - // Remove this element from the percent array so it's not processed below - asterisksArray.splice(i, 1); + + if ( width < column.minWidth ){ + width = column.minWidth; } - } - - // Redo the asterisk value, as we may have removed columns due to width constraints - asteriskVal = parseInt(remainingWidth / asteriskNum, 10); - - asterisksArray.forEach(function(column) { - var colWidth = parseInt(asteriskVal * column.width.length, 10); - - canvasWidth += colWidth; - - column.drawnWidth = colWidth; + + usedWidthSum = usedWidthSum + width; + column.drawnWidth = width; }); } - // If the grid width didn't divide evenly into the column widths and we have pixels left over, dole them out to the columns one by one to make everything fit - var leftoverWidth = availableWidth - parseInt(canvasWidth, 10); - if (leftoverWidth > 0 && canvasWidth > 0 && canvasWidth < availableWidth) { - var variableColumn = false; - // uiGridCtrl.grid.columns.forEach(function(col) { - columnCache.forEach(function(col) { - if (col.width && !angular.isNumber(col.width)) { - variableColumn = true; - } - }); + // If the grid width didn't divide evenly into the column widths and we have pixels left over, or our + // calculated widths would have the grid narrower than the available space, + // dole the remainder out one by one to make everything fit + var leftoverWidth = availableWidth - usedWidthSum; - if (variableColumn) { - var remFn = function (column) { - if (leftoverWidth > 0) { - column.drawnWidth = column.drawnWidth + 1; - canvasWidth = canvasWidth + 1; - leftoverWidth--; - } - }; - while (leftoverWidth > 0) { - columnCache.forEach(remFn); - } + var columnsToChange = true; + + var processColumn = function(column){ + if (isNaN(column.width) && column.drawnWidth < column.maxWidth && leftoverWidth > 0) { + column.drawnWidth++; + usedWidthSum++; + leftoverWidth--; + columnsToChange = true; } + }; + + while (leftoverWidth > 0 && columnsToChange) { + columnsToChange = false; + columnCache.forEach(processColumn); } - if (canvasWidth < availableWidth) { - canvasWidth = availableWidth; - } + // all that was across all the renderContainers, now we need to work out what that calculation decided for + // our renderContainer + var canvasWidth = 0; + self.visibleColumnCache.forEach(function(column){ + if ( column.visible ){ + canvasWidth = canvasWidth + column.drawnWidth; + } + }); // Build the CSS columnCache.forEach(function (column) { ret = ret + column.getColClassDefinition(); }); - // Add the vertical scrollbar width back in to the canvas width, it's taken out in getCanvasWidth - //if (self.grid.verticalScrollbarWidth) { - // canvasWidth = canvasWidth + self.grid.verticalScrollbarWidth; - //} - // canvasWidth = canvasWidth + 1; - - self.canvasWidth = parseInt(canvasWidth, 10); + self.canvasWidth = canvasWidth; // Return the styles back to buildStyles which pops them into the `customStyles` scope variable // return ret;