private IEnumerable <BFUDetailsRowColumn <TItem> > GetJustifiedColumns(IEnumerable <BFUDetailsRowColumn <TItem> > newColumns, CheckboxVisibility newCheckboxVisibility, SelectionMode newSelectionMode, double viewportWidth, int resizingColumnIndex) { var rowCheckWidth = newSelectionMode != SelectionMode.None && newCheckboxVisibility != CheckboxVisibility.Hidden ? 48 : 0; //DetailsRowCheckbox width var groupExpandedWidth = 0; //skipping this for now. double totalWidth = 0; var availableWidth = viewportWidth - (rowCheckWidth + groupExpandedWidth); int count = 0; System.Collections.Generic.List <BFUDetailsRowColumn <TItem> > adjustedColumns = new System.Collections.Generic.List <BFUDetailsRowColumn <TItem> >(); foreach (var col in newColumns) { adjustedColumns.Add(col); col.CalculatedWidth = !double.IsNaN(col.MinWidth) ? col.MinWidth : 100; if (_columnOverrides.TryGetValue(col.Key, out var overridenWidth)) { col.CalculatedWidth = overridenWidth; } var isFirst = count + resizingColumnIndex == 0; totalWidth += GetPaddedWidth(col, isFirst); } var lastIndex = adjustedColumns.Count() - 1; // Shrink or remove collapsable columns. while (lastIndex > 0 && totalWidth > availableWidth) { var col = adjustedColumns.ElementAt(lastIndex); var minWidth = !double.IsNaN(col.MinWidth) ? col.MinWidth : 100; var overflowWidth = totalWidth - availableWidth; if (col.CalculatedWidth - minWidth >= overflowWidth || !col.IsCollapsible) { var originalWidth = col.CalculatedWidth; col.CalculatedWidth = Math.Max(col.CalculatedWidth - overflowWidth, minWidth); totalWidth -= originalWidth - col.CalculatedWidth; } else { totalWidth -= GetPaddedWidth(col, false); adjustedColumns.RemoveRange(lastIndex, 1); } lastIndex--; } //Then expand columns starting at the beginning, until we've filled the width. for (var i = 0; i < adjustedColumns.Count && totalWidth < availableWidth; i++) { var col = adjustedColumns[i]; var isLast = i == adjustedColumns.Count - 1; var hasOverrides = _columnOverrides.TryGetValue(col.Key, out var overrides); if (hasOverrides && !isLast) { continue; } var spaceLeft = availableWidth - totalWidth; double increment = 0; if (isLast) { increment = spaceLeft; } else { var maxWidth = col.MaxWidth; var minWidth = !double.IsNaN(col.MinWidth) ? col.MinWidth : (!double.IsNaN(col.MaxWidth) ? col.MaxWidth : 100); increment = !double.IsNaN(maxWidth) ? Math.Min(spaceLeft, maxWidth - minWidth) : spaceLeft; } col.CalculatedWidth += increment; totalWidth += increment; } return(adjustedColumns); }
private IEnumerable <BFUDetailsRowColumn <TItem> > GetAdjustedColumns(IEnumerable <TItem> newItems, DetailsListLayoutMode newLayoutMode, SelectionMode newSelectionMode, CheckboxVisibility newCheckboxVisibility, IEnumerable <BFUDetailsRowColumn <TItem> > newColumns, bool forceUpdate, int resizingColumnIndex) { var columns = Columns.EmptyIfNull(); var lastWidth = _lastWidth; var lastSelectionMode = _lastSelectionMode; if (!forceUpdate && _lastViewport.ScrollWidth == _viewport.ScrollWidth && SelectionMode == newSelectionMode && (Columns == null || newColumns == Columns)) { return(Enumerable.Empty <BFUDetailsRowColumn <TItem> >()); } // skipping default column builder... user must provide columns always IEnumerable <BFUDetailsRowColumn <TItem> > adjustedColumns = null; if (LayoutMode == DetailsListLayoutMode.FixedColumns) { adjustedColumns = GetFixedColumns(newColumns); foreach (var col in adjustedColumns) { _columnOverrides[col.Key] = col.CalculatedWidth; } } else { if (resizingColumnIndex != -1) { adjustedColumns = GetJustifiedColumnsAfterResize(newColumns, newCheckboxVisibility, newSelectionMode, _viewport.ScrollWidth, resizingColumnIndex); } else { adjustedColumns = GetJustifiedColumns(newColumns, newCheckboxVisibility, newSelectionMode, _viewport.ScrollWidth, resizingColumnIndex); } foreach (var col in adjustedColumns) { _columnOverrides[col.Key] = col.CalculatedWidth; } } return(adjustedColumns); }
private IEnumerable <BFUDetailsRowColumn <TItem> > GetJustifiedColumnsAfterResize(IEnumerable <BFUDetailsRowColumn <TItem> > newColumns, CheckboxVisibility newCheckboxVisibility, SelectionMode newSelectionMode, double viewportWidth, int resizingColumnIndex) { var fixedColumns = newColumns.Take(resizingColumnIndex); foreach (var col in fixedColumns) { if (_columnOverrides.TryGetValue(col.Key, out var overridenWidth)) { col.CalculatedWidth = overridenWidth; } else { col.CalculatedWidth = double.NaN; } } int count = 0; var fixedWidth = fixedColumns.Aggregate <BFUDetailsRowColumn <TItem>, double, double>(0, (total, column) => total + GetPaddedWidth(column, ++count == 0), x => x); var remainingColumns = newColumns.Skip(resizingColumnIndex).Take(newColumns.Count() - resizingColumnIndex); var remainingWidth = viewportWidth - fixedWidth; var adjustedColumns = GetJustifiedColumns(remainingColumns, newCheckboxVisibility, newSelectionMode, remainingWidth, resizingColumnIndex); return(Enumerable.Concat(fixedColumns, adjustedColumns)); }
private void AdjustColumns(IEnumerable <TItem> newItems, DetailsListLayoutMode newLayoutMode, SelectionMode newSelectionMode, CheckboxVisibility newCheckboxVisibility, IEnumerable <BFUDetailsRowColumn <TItem> > newColumns, bool forceUpdate, int resizingColumnIndex = -1) { _adjustedColumns = GetAdjustedColumns(newItems, newLayoutMode, newSelectionMode, newCheckboxVisibility, newColumns, forceUpdate, resizingColumnIndex); }