diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.Drawing.cs b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.Drawing.cs index 7abd4ace37..ba16b89f99 100644 --- a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.Drawing.cs +++ b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.Drawing.cs @@ -16,13 +16,18 @@ namespace BizHawk.Client.EmuHawk // White Background _renderer.SetBrush(Color.White); _renderer.SetSolidPen(Color.White); - _renderer.FillRectangle(new Rectangle(0, CellHeight, _drawWidth, _drawHeight)); + _renderer.FillRectangle(e.ClipRectangle); // Lag frame calculations SetLagFramesArray(); - var visibleColumns = _columns.VisibleColumns.ToList(); + var visibleColumns = _columns.VisibleColumns + .Where(c => c.Left < e.ClipRectangle.Width) + .ToList(); + // TODO: FirstVisibleRow assumes there is a visible row + var firstVisibleRow = FirstVisibleRow; + var lastVisibleRow = firstVisibleRow + CalcVisibleRows(e.ClipRectangle); CalculateHorizontalColumnPositions(visibleColumns); if (visibleColumns.Any()) @@ -32,10 +37,10 @@ namespace BizHawk.Client.EmuHawk } // Background - DrawBg(visibleColumns); + DrawBg(visibleColumns, e.ClipRectangle); // Foreground - DrawData(visibleColumns); + DrawData(visibleColumns, e.ClipRectangle, firstVisibleRow, lastVisibleRow); DrawColumnDrag(visibleColumns); DrawCellDrag(visibleColumns); @@ -57,6 +62,8 @@ namespace BizHawk.Client.EmuHawk private void CalculateHorizontalColumnPositions(List visibleColumns) { + int firstVisibleRow = FirstVisibleRow; + if (!HorizontalOrientation) { _horizontalColumnHeights = null; @@ -68,7 +75,7 @@ namespace BizHawk.Client.EmuHawk _horizontalColumnTops = new int[visibleColumns.Count]; int top = 0; - int startRow = FirstVisibleRow; + int startRow = firstVisibleRow; for (int j = 0; j < visibleColumns.Count; j++) { RollColumn col = visibleColumns[j]; @@ -200,8 +207,11 @@ namespace BizHawk.Client.EmuHawk } } - private void DrawData(List visibleColumns) + private void DrawData(List visibleColumns, Rectangle rect, int firstVisibleRow, int lastVisibleRow) { + int firstVisibleColumn = FirstVisibleColumn(visibleColumns); + var lastVisibleColumn = LastVisibleColumn(visibleColumns, rect.Width); + // Prevent exceptions with small TAStudio windows if (visibleColumns.Count == 0) { @@ -213,14 +223,14 @@ namespace BizHawk.Client.EmuHawk return; } - int startRow = FirstVisibleRow; - int range = Math.Min(LastVisibleRow, RowCount - 1) - startRow + 1; + int startRow = firstVisibleRow; + int range = Math.Min(lastVisibleRow, RowCount - 1) - startRow + 1; _renderer.PrepDrawString(Font, _foreColor); if (HorizontalOrientation) { - int lastVisible = LastVisibleColumn; - for (int j = FirstVisibleColumn; j <= lastVisible; j++) + int lastVisible = lastVisibleRow; + for (int j = firstVisibleRow; j <= lastVisible; j++) { RollColumn col = visibleColumns[j]; int colHeight = GetHColHeight(j); @@ -280,8 +290,8 @@ namespace BizHawk.Client.EmuHawk for (int i = 0, f = 0; f < range; i++, f++) // Vertical { f += _lagFrames[i]; - int lastVisible = LastVisibleColumn; - for (int j = FirstVisibleColumn; j <= lastVisible; j++) // Horizontal + int lastVisible = lastVisibleColumn; + for (int j = firstVisibleColumn; j <= lastVisible; j++) // Horizontal { RollColumn col = visibleColumns[j]; @@ -434,11 +444,11 @@ namespace BizHawk.Client.EmuHawk // TODO refactor this and DoBackGroundCallback functions. // Draw Gridlines and background colors using QueryItemBkColor. - private void DrawBg(List visibleColumns) + private void DrawBg(List visibleColumns, Rectangle rect) { if (QueryItemBkColor != null) { - DoBackGroundCallback(visibleColumns); + DoBackGroundCallback(visibleColumns, rect.Width); } if (GridLines) @@ -579,12 +589,12 @@ namespace BizHawk.Client.EmuHawk } // Calls QueryItemBkColor callback for all visible cells and fills in the background of those cells. - private void DoBackGroundCallback(List visibleColumns) + private void DoBackGroundCallback(List visibleColumns, int width) { int startIndex = FirstVisibleRow; int range = Math.Min(LastVisibleRow, RowCount - 1) - startIndex + 1; - int lastVisibleColumn = LastVisibleColumn; - int firstVisibleColumn = FirstVisibleColumn; + int lastVisibleColumn = LastVisibleColumn(visibleColumns, width); + int firstVisibleColumn = FirstVisibleColumn(visibleColumns); // Prevent exceptions with small TAStudio windows if (firstVisibleColumn < 0) diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs index 506864c084..017efc776a 100644 --- a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs +++ b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs @@ -778,35 +778,39 @@ namespace BizHawk.Client.EmuHawk } } - private int FirstVisibleColumn + // TODO: don't duplicate property logic + private int CalcVisibleRows(Rectangle rect) { - get + if (HorizontalOrientation) { - var columnList = VisibleColumns.ToList(); - - if (HorizontalOrientation) - { - return Enumerable.Range(0, columnList.Count).First(i => GetHColBottom(i) > _vBar.Value); - } - - return columnList.FindIndex(c => c.Right > _hBar.Value); + return (rect.Width - MaxColumnWidth) / CellWidth; } + + return (rect.Height - ColumnHeight - 3) / CellHeight; // Minus three makes it work } - private int LastVisibleColumn + // TODO: account for no visible columns + private int FirstVisibleColumn(List columnList) { - get + if (HorizontalOrientation) { - var columnList = VisibleColumns.ToList(); - - if (HorizontalOrientation) - { - int count = columnList.Count; - return Enumerable.Range(0, count).Select(i => count - 1 - i).First(i => GetHColTop(i) <= _drawWidth + _hBar.Value); - } - - return columnList.FindLastIndex(c => c.Left <= _drawWidth + _hBar.Value); + return Enumerable.Range(0, columnList.Count).First(i => GetHColBottom(i) > _vBar.Value); } + + return columnList.FindIndex(c => c.Right > _hBar.Value); + } + + private int LastVisibleColumn(List columnList, int width) + { + if (HorizontalOrientation) + { + int count = columnList.Count; + return Enumerable.Range(0, count) + .Select(i => count - 1 - i) + .First(i => GetHColTop(i) <= _drawWidth + _hBar.Value); + } + + return columnList.FindLastIndex(c => c.Left <= _drawWidth + _hBar.Value && c.Left < width); } private Cell _draggingCell;