Skip to content

Commit

Permalink
Better handle merges with hidden rows/columns.
Browse files Browse the repository at this point in the history
  • Loading branch information
anmcgrath committed Jun 30, 2024
1 parent 0ac788f commit b263a9d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 24 deletions.
68 changes: 46 additions & 22 deletions src/BlazorDatasheet/DatasheetRow.razor
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,53 @@
@for (int j = VisualSheet.Viewport.VisibleRegion.Left; j <= VisualSheet.Viewport.VisibleRegion.Right; j++)
{
var col = j;
var cell = VisualSheet.GetVisualCell(Row, col);
if(!cell.IsVisible)
var visualCell = VisualSheet.GetVisualCell(Row, col);

if (!visualCell.IsVisible)
continue;

var k = col;

var rowSpan = 1;
var colSpan = 1;
var dataCol = col;
var dataRow = Row;

if (!Virtualise && cell.Merge != null)
if (!Virtualise && visualCell.Merge != null)
{
if (cell.Merge.Top == Row && cell.Merge.Left == col)
if (!Sheet.Rows.IsVisible(Row) || !Sheet.Rows.IsVisible(col))
continue;

if (Sheet.Rows.IsVisible(visualCell.Merge.Top) && Sheet.Columns.IsVisible(visualCell.Merge.Left))
{
rowSpan = cell.Merge.Height;
colSpan = cell.Merge.Width;
dataCol = cell.Merge.Left;
dataRow = cell.Merge.Top;
if (visualCell.Merge.Top == Row && visualCell.Merge.Left == col)
{
rowSpan = Sheet.Rows.CountVisible(Row, visualCell.Merge.Bottom);
colSpan = Sheet.Columns.CountVisible(col, visualCell.Merge.Right);
dataCol = visualCell.Merge.Left;
dataRow = visualCell.Merge.Top;
}
else
continue;
}
else // cell top left is not visible
{
var nextVisibleRow = Sheet.Rows.GetNextVisible(visualCell.Merge.Top - 1);
var nextVisibleCol = Sheet.Columns.GetNextVisible(visualCell.Merge.Left - 1);

if (nextVisibleCol == col && nextVisibleRow == Row)
{
rowSpan = Sheet.Rows.CountVisible(Row, visualCell.Merge.Bottom);
colSpan = Sheet.Columns.CountVisible(col, visualCell.Merge.Right);
dataCol = visualCell.Merge.Left;
dataRow = visualCell.Merge.Top;
visualCell = VisualSheet.GetVisualCell(visualCell.Merge.Top, visualCell.Merge.Left);
}
else
{
continue;
}
}
else
continue;
}

<td
Expand All @@ -37,34 +61,34 @@
colspan="@colSpan"
rowspan="@rowSpan"
class="sheet-cell"
style="@cell.FormatStyleString">
style="@visualCell.FormatStyleString">
<div style="display: flex;">
@if (cell.Icon != null)
@if (visualCell.Icon != null)
{
<div
style="margin-right:2px; float:left; color: @(cell.Format?.IconColor ?? "var(--icon-color)");">
@GetIconRenderFragment(cell.Icon)
style="margin-right:2px; float:left; color: @(visualCell.Format?.IconColor ?? "var(--icon-color)");">
@GetIconRenderFragment(visualCell.Icon)
</div>
}
@switch (cell.CellType)
@switch (visualCell.CellType)
{
case "default":
case "datetime":
<div style="width: 100%;">
@cell.FormattedString
@visualCell.FormattedString
</div>
break;
case "boolean":
<BoolRenderer Cell="cell" Sheet="Sheet"/>
<BoolRenderer Cell="visualCell" Sheet="Sheet"/>
break;
case "select":
<SelectRenderer Cell="cell" Sheet="Sheet"/>
<SelectRenderer Cell="visualCell" Sheet="Sheet"/>
break;

default:
<DynamicComponent
Parameters="@GetCellRendererParameters(cell)"
Type="@GetCellRendererType(cell.CellType)"/>
Parameters="@GetCellRendererParameters(visualCell)"
Type="@GetCellRendererType(visualCell.CellType)"/>
break;
}
</div>
Expand Down
4 changes: 2 additions & 2 deletions src/BlazorDatasheet/VirtualMergesRenderer.razor
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,11 @@
if (isMergeStartVisible)
return true;

var nextVisibleRow = Sheet.Rows.GetNextVisible(merge.Top);
var nextVisibleRow = Sheet.Rows.GetNextVisible(merge.Top - 1);
if (!merge.Spans(nextVisibleRow, Axis.Row))
return false;

var nextVisibleCol = Sheet.Columns.GetNextVisible(merge.Left);
var nextVisibleCol = Sheet.Columns.GetNextVisible(merge.Left - 1);
if (!merge.Spans(nextVisibleCol, Axis.Col))
return false;
return true;
Expand Down

0 comments on commit b263a9d

Please sign in to comment.