diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.Drawing.cs b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.Drawing.cs index ae84969b6c..ade2db4483 100644 --- a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.Drawing.cs +++ b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.Drawing.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; @@ -167,48 +167,75 @@ namespace BizHawk.Client.EmuHawk if (HorizontalOrientation) { int startRow = FirstVisibleRow; - int range = Math.Min(LastVisibleRow, RowCount - 1) - startRow + 1; - - _renderer.PrepDrawString(_font, _foreColor); - for (int i = 0, f = 0; f < range; i++, f++) - { - f += _lagFrames[i]; - int lastVisible = LastVisibleColumnIndex; - for (int j = FirstVisibleColumn; j <= lastVisible; j++) + int range = Math.Min(LastVisibleRow, RowCount - 1) - startRow + 1; + + _renderer.PrepDrawString(_font, _foreColor); + int lastVisible = LastVisibleColumnIndex; + for (int j = FirstVisibleColumn; j <= lastVisible; j++) + { + RollColumn col = visibleColumns[j]; + + // Just a proof of concept to test auto-calculating the column height in horizontal + // mode. This would of course need to happen before any drawing because it's also + // needed for the column headers and background. + int debugColHeight = CellHeight; + if (col.Rotatable && col.RotatedHeight != null) + { + debugColHeight = Math.Max(debugColHeight, col.RotatedHeight.Value); + } + else if (col.Rotatable) + { + string text; + int strOffsetX = 0; + int strOffsetY = 0; + QueryItemText(startRow, col, out text, ref strOffsetX, ref strOffsetY); + int textWidth = _renderer.MeasureString(text, _font).Width; + debugColHeight = Math.Max(debugColHeight, strOffsetX + textWidth + (CellWidthPadding * 2)); + } + + for (int i = 0, f = 0; f < range; i++, f++) { + f += _lagFrames[i]; + Bitmap image = null; - int x; - int y; int bitmapOffsetX = 0; int bitmapOffsetY = 0; - QueryItemIcon?.Invoke(f + startRow, visibleColumns[j], ref image, ref bitmapOffsetX, ref bitmapOffsetY); + QueryItemIcon?.Invoke(f + startRow, col, ref image, ref bitmapOffsetX, ref bitmapOffsetY); if (image != null) { - x = RowsToPixels(i) + CellWidthPadding + bitmapOffsetX; - y = (j * CellHeight) + (CellHeightPadding * 2) + bitmapOffsetY; + int x = RowsToPixels(i) + CellWidthPadding + bitmapOffsetX; + int y = (j * CellHeight) + (CellHeightPadding * 2) + bitmapOffsetY; _renderer.DrawBitmap(image, new Point(x, y)); } string text; int strOffsetX = 0; int strOffsetY = 0; - QueryItemText(f + startRow, visibleColumns[j], out text, ref strOffsetX, ref strOffsetY); + QueryItemText(f + startRow, col, out text, ref strOffsetX, ref strOffsetY); - // Center Text - x = RowsToPixels(i) + ((CellWidth - (text.Length * _charSize.Width)) / 2); - y = (j * CellHeight) + CellHeightPadding - _vBar.Value; - var point = new Point(x + strOffsetX, y + strOffsetY); - - if (visibleColumns[j].Name == "FrameColumn") // TODO: don't do this hack + int baseX = RowsToPixels(i) + (col.Rotatable ? CellWidth : 0); + int baseY = j * CellHeight - _vBar.Value; + int textWidth = text.Length * _charSize.Width; + if (col.Rotatable) { + // Center Text + int textX = Math.Max(((CellHeight - textWidth) / 2), CellWidthPadding) + strOffsetX; + int textY = CellWidthPadding + strOffsetY; + var point = new Point(baseX - textY, baseY + textX); + _renderer.PrepDrawString(_font, _foreColor, rotate: true); - DrawString(text, ColumnWidth, new Point(point.X + _charSize.Height + CellWidthPadding, point.Y + CellHeightPadding)); + DrawString(text, null /* TODO */, point); _renderer.PrepDrawString(_font, _foreColor, rotate: false); } else - { + { + // Center Text + int textX = Math.Max(((CellWidth - textWidth) / 2), CellWidthPadding) + strOffsetX; + int textY = CellHeightPadding + strOffsetY; + var point = new Point(baseX + textX, baseY + textY); + DrawString(text, ColumnWidth, point); } } diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs index b614d1bf17..5f51367ebc 100644 --- a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs +++ b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs @@ -1166,7 +1166,7 @@ namespace BizHawk.Client.EmuHawk { // do marker drag here } - else if (ModifierKeys == Keys.Shift && (CurrentCell.Column.Name == "FrameColumn" || CurrentCell.Column.Type == ColumnType.Text)) + else if (ModifierKeys == Keys.Shift && CurrentCell.Column.Type == ColumnType.Text) { if (_selectedItems.Any()) { @@ -1235,7 +1235,7 @@ namespace BizHawk.Client.EmuHawk SelectCell(CurrentCell); } } - else if (ModifierKeys == Keys.Control && (CurrentCell.Column.Name == "FrameColumn" || CurrentCell.Column.Type == ColumnType.Text)) + else if (ModifierKeys == Keys.Control && CurrentCell.Column.Type == ColumnType.Text) { SelectCell(CurrentCell, toggle: true); } diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/RollColumn.cs b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/RollColumn.cs index 1ddb5346cc..0999e9ebe6 100644 --- a/BizHawk.Client.EmuHawk/CustomControls/InputRoll/RollColumn.cs +++ b/BizHawk.Client.EmuHawk/CustomControls/InputRoll/RollColumn.cs @@ -1,4 +1,6 @@ -namespace BizHawk.Client.EmuHawk +using System; + +namespace BizHawk.Client.EmuHawk { public class RollColumn { @@ -15,5 +17,15 @@ /// Column will be drawn with an emphasized look, if true /// public bool Emphasis { get; set; } + + /// + /// Column header text will be drawn rotated, if true + /// + public bool Rotatable { get; set; } + + /// + /// If drawn rotated, specifies the desired height, or null to auto-size + /// + public int? RotatedHeight { get; set; } } } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs index 147b7b8389..1165a2cb11 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs @@ -319,7 +319,10 @@ namespace BizHawk.Client.EmuHawk } else if (columnName == FrameColumnName) { - offsetX = 7; + if (!TasView.HorizontalOrientation) + { + offsetX = 7; + } text = index.ToString().PadLeft(CurrentTasMovie.InputLogLength.ToString().Length, '0'); } else diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index 88166d2401..a2949ed6c6 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -395,7 +395,15 @@ namespace BizHawk.Client.EmuHawk { TasView.AllColumns.Clear(); AddColumn(CursorColumnName, "", 18); - AddColumn(FrameColumnName, "Frame#", 68); + AddColumn( + new RollColumn + { + Name = FrameColumnName, + Text = "Frame#", + Width = 68, + Type = ColumnType.Text, + Rotatable = true + }); var columnNames = GenerateColumnNames(); foreach (var kvp in columnNames) @@ -480,18 +488,20 @@ namespace BizHawk.Client.EmuHawk public void AddColumn(string columnName, string columnText, int columnWidth, ColumnType columnType = ColumnType.Boolean) { - if (TasView.AllColumns[columnName] == null) - { - var column = new RollColumn + AddColumn( + new RollColumn { Name = columnName, Text = columnText, Width = columnWidth, Type = columnType - }; + }); + } + private void AddColumn(RollColumn column) + { + if (TasView.AllColumns[column.Name] == null) TasView.AllColumns.Add(column); - } } private void EngageTastudio()