diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs
index a5c8ed344c..5b978bf10b 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs
@@ -10,6 +10,9 @@ using System.Collections;
namespace BizHawk.Client.EmuHawk
{
+ //Row width depends on font size and padding
+ //Column width is specified in column headers
+ //Row width is specified for horizontal orientation
public class InputRoll : Control
{
private readonly GDIRenderer Gdi;
@@ -21,7 +24,9 @@ namespace BizHawk.Client.EmuHawk
private readonly HScrollBar HBar;
private int _horizontalOrientedColumnWidth = 0;
- private int _itemCount = 0;
+ private bool _horizontalOrientation = false;
+
+ private int _rowCount = 0;
private Size _charSize;
public InputRoll()
@@ -40,8 +45,8 @@ namespace BizHawk.Client.EmuHawk
Location = new Point(0, Height - 16),
Visible = false,
Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right,
- SmallChange = 1,
- LargeChange = 5
+ SmallChange = 5,
+ LargeChange = 20
};
UseCustomBackground = true;
@@ -69,6 +74,7 @@ namespace BizHawk.Client.EmuHawk
VBar.ValueChanged += VerticalBar_ValueChanged;
HBar.ValueChanged += HorizontalBar_ValueChanged;
+ HorizontalOrientation = false;
RecalculateScrollBars();
_columns.ChangedCallback = ColumnChangedCallback;
}
@@ -99,22 +105,34 @@ namespace BizHawk.Client.EmuHawk
/// Gets or sets whether the control is horizontal or vertical
///
[Category("Behavior")]
- public bool HorizontalOrientation { get; set; }
+ public bool HorizontalOrientation {
+ get{
+ return _horizontalOrientation;
+ }
+ set
+ {
+ if (_horizontalOrientation != value)
+ {
+ _horizontalOrientation = value;
+ OrientationChanged();
+ }
+ }
+ }
///
- /// Gets or sets the sets the virtual number of items to be displayed.
+ /// Gets or sets the sets the virtual number of rows to be displayed.
///
[Category("Behavior")]
- public int ItemCount
+ public int RowCount
{
get
{
- return _itemCount;
+ return _rowCount;
}
set
{
- _itemCount = value;
+ _rowCount = value;
RecalculateScrollBars();
}
}
@@ -162,7 +180,7 @@ namespace BizHawk.Client.EmuHawk
{
var oldFullRowVal = FullRowSelect;
FullRowSelect = true;
- for (int i = 0; i < ItemCount; i++)
+ for (int i = 0; i < RowCount; i++)
{
SelectItem(i, true);
}
@@ -260,7 +278,7 @@ namespace BizHawk.Client.EmuHawk
}
else
{
- var items = SelectedItems.Where(i => i.RowIndex == index);
+ var items = SelectedItems.Where(cell => cell.RowIndex == index);
SelectedItems.RemoveAll(x => items.Contains(x));
}
}
@@ -272,9 +290,9 @@ namespace BizHawk.Client.EmuHawk
{
get
{
- if (SelectedIndices.Any())
+ if (SelectedRows.Any())
{
- return SelectedIndices
+ return SelectedRows
.OrderBy(x => x)
.First();
}
@@ -289,9 +307,9 @@ namespace BizHawk.Client.EmuHawk
{
get
{
- if (SelectedIndices.Any())
+ if (SelectedRows.Any())
{
- return SelectedIndices
+ return SelectedRows
.OrderBy(x => x)
.Last();
}
@@ -300,10 +318,16 @@ namespace BizHawk.Client.EmuHawk
}
}
+ ///
+ /// The current Cell that the mouse was in.
+ ///
[Browsable(false)]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
public Cell CurrentCell { get; set; }
+ ///
+ /// The previous Cell that the mouse was in.
+ ///
[Browsable(false)]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
public Cell LastCell { get; set; }
@@ -326,11 +350,11 @@ namespace BizHawk.Client.EmuHawk
}
///
- /// Gets or sets the first visiable row index, if scrolling is needed
+ /// Gets or sets the first visible row index, if scrolling is needed
///
[Browsable(false)]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
- public int ScrollPosition
+ public int FirstVisibleRow
{
get
{
@@ -373,11 +397,11 @@ namespace BizHawk.Client.EmuHawk
private bool _programmaticallyUpdatingScrollBarValues = false;
- public int LastVisibleIndex
+ public int LastVisibleRow
{
get
{
- return ScrollPosition + VisibleRows;
+ return FirstVisibleRow + VisibleRows;
}
set
@@ -388,7 +412,7 @@ namespace BizHawk.Client.EmuHawk
i = 0;
}
- ScrollPosition = i;
+ FirstVisibleRow = i;
}
}
@@ -403,7 +427,7 @@ namespace BizHawk.Client.EmuHawk
{
if (HorizontalOrientation)
{
- return (Width - _horizontalOrientedColumnWidth) / CellWidth;
+ //return (Width - _horizontalOrientedColumnWidth) / CellWidth;
}
return (Height / CellHeight) - 1;
@@ -413,7 +437,7 @@ namespace BizHawk.Client.EmuHawk
// TODO: make IEnumerable, IList is for legacy support
[Browsable(false)]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
- public IList SelectedIndices
+ public IList SelectedRows
{
get
{
@@ -431,11 +455,14 @@ namespace BizHawk.Client.EmuHawk
protected override void OnPaint(PaintEventArgs e)
{
- VBar.Location = new Point(Width - 16, 0);
using (var LCK = Gdi.LockGraphics(e.Graphics))
{
Gdi.StartOffScreenBitmap(Width, Height);
+ Point startPoint = StartBg();
+ Gdi.SetBrush(Color.White);
+ Gdi.SetSolidPen(Color.Black);
+ Gdi.FillRectangle(startPoint.X, startPoint.Y, Width, Height);
// Header
if (_columns.Any())
{
@@ -449,6 +476,11 @@ namespace BizHawk.Client.EmuHawk
// ForeGround
DrawData(e);
+ //Border
+ //Gdi.SetBrush(Color.none);
+ Gdi.SetSolidPen(Color.Black);
+ //Gdi.DrawRectangle(startPoint.X, startPoint.Y, Width, Height);
+
Gdi.CopyToScreen();
Gdi.EndOffScreenBitmap();
}
@@ -485,11 +517,10 @@ namespace BizHawk.Client.EmuHawk
}
else
{
- int start = CellPadding;
Gdi.PrepDrawString(this.Font, this.ForeColor);
foreach (var column in _columns)
{
- var point = new Point(start + CellPadding, CellPadding);
+ var point = new Point(column.Left.Value + 2* CellPadding - HBar.Value, CellPadding);//TODO: fix this CellPadding issue (2 * CellPadding vs just CellPadding)
if (IsHoveringOnColumnCell && column == CurrentCell.Column)
{
@@ -501,8 +532,6 @@ namespace BizHawk.Client.EmuHawk
{
Gdi.DrawString(column.Text, point);
}
-
- start += CalcWidth(column);
}
}
}
@@ -515,9 +544,9 @@ namespace BizHawk.Client.EmuHawk
{
int startIndex = NeedsHScrollbar ? HBar.Value : 0;
int endIndex = startIndex + (Width / CellWidth);
- if (endIndex >= ItemCount)
+ if (endIndex >= RowCount)
{
- endIndex = ItemCount;
+ endIndex = RowCount;
}
int range = endIndex - startIndex;
@@ -534,38 +563,36 @@ namespace BizHawk.Client.EmuHawk
QueryItemText(i + startIndex, j, out text);
if (!string.IsNullOrWhiteSpace(text))
{
- Gdi.DrawString(text, point);
- }
+ Gdi.DrawString(text, point);
}
}
}
+ }
else
{
- int startIndex = NeedsVScrollbar ? VBar.Value : 0;
- int endIndex = startIndex + (Height / CellHeight);
+ int startRow = NeedsVScrollbar ? VBar.Value : 0;
+ int endRow = startRow + VisibleRows;
- if (endIndex >= ItemCount)
+ if (endRow >= RowCount)
{
- endIndex = ItemCount;
+ endRow = RowCount;
}
- int range = endIndex - startIndex;
+ int range = endRow - startRow;
Gdi.PrepDrawString(this.Font, this.ForeColor);
- for (int i = 0; i < range; i++)
+ int xPadding = CellPadding + 1 - HBar.Value;
+ for (int i = 0; i < range; i++)//Vertical
{
- int x = 1;
- for (int j = 0; j < _columns.Count; j++)
+ for (int j = 0; j < _columns.Count; j++)//Horizontal
{
string text;
- var point = new Point(x + CellPadding, (i + 1) * CellHeight); // +1 accounts for the column header
- QueryItemText(i + startIndex, j, out text);
+ var point = new Point(_columns[j].Left.Value + xPadding, (i + 1) * CellHeight); //i + 1 accounts for the column header
+ QueryItemText(i + startRow, j, out text);
if (!string.IsNullOrWhiteSpace(text))
{
Gdi.DrawString(text, point);
}
-
- x += CalcWidth(_columns[j]);
}
}
}
@@ -594,11 +621,23 @@ namespace BizHawk.Client.EmuHawk
Gdi.DrawRectangle(0, 0, Width, CellHeight + 1);
Gdi.FillRectangle(1, 1, Width - 2, CellHeight);
- int start = 0;
- foreach (var column in _columns)
+ for (int i = 0; i < _columns.Count; i++)
{
- start += CalcWidth(column);
- Gdi.Line(start, 0, start, CellHeight);
+ int pos = _columns[i].Left.Value - HBar.Value;
+ if (pos >= 0)
+ {
+ Gdi.Line(pos, 0, pos, CellHeight);
+ }
+ }
+
+ //Draw right most line if visible
+ if (_columns.Count > 0)
+ {
+ int right = _columns.Last().Left.Value + _columns.Last().Width.Value - HBar.Value;
+ if (right <= Width)
+ {
+ Gdi.Line(right, 0, right, CellHeight);
+ }
}
}
@@ -607,50 +646,91 @@ namespace BizHawk.Client.EmuHawk
{
if (HorizontalOrientation)
{
+ int start = -HBar.Value;
for (int i = 0; i < _columns.Count; i++)
{
- if (_columns[i] == CurrentCell.Column)
+ if (_columns[i] != CurrentCell.Column)
{
- Gdi.SetBrush(SystemColors.Highlight);
- Gdi.FillRectangle(
+ start += _columns[i].Width.Value;
+ continue;
+ }
+
+ int colWidth = _columns[i].Width.Value;
+ Gdi.SetBrush(SystemColors.Highlight);
+ if (start >= 0)
+ {
+ if (start + colWidth < Width)//Left side and right side visible
+ {
+ Gdi.FillRectangle(
1,
(i * CellHeight) + 1,
_horizontalOrientedColumnWidth - 1,
CellHeight - 1);
+ }
+ else//Only Left side visible
+ {
+ Gdi.FillRectangle(
+ 1,
+ (i * CellHeight) + 1,
+ _horizontalOrientedColumnWidth - 1,
+ CellHeight - 1);
+ }
}
+ else
+ {
+ if (start + colWidth < Width)//Only rightLeft side visible
+ {
+ Gdi.FillRectangle(
+ 1,
+ (i * CellHeight) + 1,
+ _horizontalOrientedColumnWidth - 1,
+ CellHeight - 1);
+ }
+ else//Not Visible
+ {
+
+ }
+ }
+
+ start += _columns[i].Width.Value;
}
+ //if (_columns[i] == CurrentCell.Column)
+ //{
+
+ //}
}
else
{
- int start = 0;
+ //TODO multiple selected cells
for (int i = 0; i < _columns.Count; i++)
{
- var width = CalcWidth(_columns[i]);
- if (_columns[i] == CurrentCell.Column)
- {
+ if (_columns[i] == CurrentCell.Column){
+ //Left of column is to the right of the viewable area or right of column is to the left of the viewable area
+ if(_columns[i].Left.Value - HBar.Value > Width || _columns[i].Right.Value - HBar.Value < 0){
+ continue;
+ }
+ int left = _columns[i].Left.Value - HBar.Value;
+ int width = _columns[i].Right.Value - HBar.Value - left;
Gdi.SetBrush(SystemColors.Highlight);
- Gdi.FillRectangle(start + 1, 1, width - 1, CellHeight - 1);
+ Gdi.FillRectangle(left + 1, 1, width - 1, CellHeight - 1);
}
-
- start += width;
}
}
}
}
-
+ //TODO refactor this and DoBackGroundCallback functions.
+ ///
+ /// Draw Gridlines and background colors using QueryItemBkColor.
+ ///
+ ///
private void DrawBg(PaintEventArgs e)
{
- var startPoint = StartBg();
-
- Gdi.SetBrush(Color.White);
- Gdi.SetSolidPen(Color.Black);
- Gdi.DrawRectangle(startPoint.X, startPoint.Y, Width, Height);
+
if (QueryItemBkColor != null && UseCustomBackground)
{
DoBackGroundCallback(e);
}
-
if (GridLines)
{
Gdi.SetSolidPen(SystemColors.ControlLight);
@@ -678,11 +758,10 @@ namespace BizHawk.Client.EmuHawk
else
{
// Columns
- int x = 0;
int y = CellHeight + 1;
foreach (var column in _columns)
{
- x += CalcWidth(column);
+ int x = column.Left.Value - HBar.Value;
Gdi.Line(x, y, x, Height - 1);
}
@@ -724,20 +803,9 @@ namespace BizHawk.Client.EmuHawk
}
else
{
- foreach (var column in _columns)
- {
- if (cell.Column == column)
- {
- w = CalcWidth(column) - 1;
- break;
- }
- else
- {
- x += CalcWidth(column);
- }
- }
+ w = cell.Column.Width.Value - 1;
+ x = cell.Column.Left.Value - HBar.Value + 1;
- x += 1;
y = (CellHeight * (cell.RowIndex.Value + 1)) + 2; // We can't draw without row and column, so assume they exist and fail catastrophically if they don't
h = CellHeight - 1;
}
@@ -746,35 +814,38 @@ namespace BizHawk.Client.EmuHawk
Gdi.FillRectangle(x, y, w, h);
}
+ ///
+ /// Calls QueryItemBkColor callback for all visible cells and fills in the background of those cells.
+ ///
+ ///
private void DoBackGroundCallback(PaintEventArgs e)
{
if (HorizontalOrientation)
{
int startIndex = NeedsHScrollbar ? HBar.Value : 0;
int endIndex = startIndex + (Width / CellWidth);
- if (endIndex >= ItemCount)
+ if (endIndex >= RowCount)
{
- endIndex = ItemCount;
+ endIndex = RowCount;
}
int range = endIndex - startIndex;
for (int i = 0; i < range; i++)
{
- for (int j = 0; j < _columns.Count; j++)
+ for (int j = 0; j < _columns.Count; j++)//TODO: Don't query all columns
{
Color color = Color.White;
QueryItemBkColor(i + startIndex, j, ref color);
- // TODO: refactor to use DrawCellBG
if (color != Color.White) // An easy optimization, don't draw unless the user specified something other than the default
{
- Gdi.SetBrush(color);
- Gdi.FillRectangle(
- _horizontalOrientedColumnWidth + (i * CellWidth) + 2,
- (j * CellHeight) + 1,
- CellWidth - 1,
- CellHeight - 1);
+ var cell = new Cell()
+ {
+ Column = _columns[j],
+ RowIndex = i
+ };
+ DrawCellBG(color, cell);
}
}
}
@@ -784,29 +855,28 @@ namespace BizHawk.Client.EmuHawk
int startIndex = NeedsVScrollbar ? VBar.Value : 0;
int endIndex = startIndex + (Height / CellHeight);
- if (endIndex >= ItemCount)
+ if (endIndex >= RowCount)
{
- endIndex = ItemCount;
+ endIndex = RowCount;
}
int range = endIndex - startIndex;
- for (int i = 0; i < range; i++)
+ for (int i = 0; i < range; i++)//Vertical
{
- int x = 1;
- for (int j = 0; j < _columns.Count; j++)
+ for (int j = 0; j < _columns.Count; j++)//Horizontal
{
Color color = Color.White;
QueryItemBkColor(i + startIndex, j, ref color);
-
- var width = CalcWidth(_columns[j]);
if (color != Color.White) // An easy optimization, don't draw unless the user specified something other than the default
{
- Gdi.SetBrush(color);
- Gdi.FillRectangle(x, ((i + 1) * CellHeight) + 2, width - 1, CellHeight - 1);
+ var cell = new Cell()
+ {
+ Column = _columns[j],
+ RowIndex = i
+ };
+ DrawCellBG(color, cell);
}
-
- x += width;
}
}
}
@@ -829,7 +899,17 @@ namespace BizHawk.Client.EmuHawk
protected override void OnMouseMove(MouseEventArgs e)
{
- CalculatePointedCell(e.X, e.Y);
+ var newCell = CalculatePointedCell(e.X, e.Y);
+ if (!newCell.Equals(CurrentCell))
+ {
+ CellChanged(newCell);
+
+ if (IsHoveringOnColumnCell ||
+ (WasHoveringOnColumnCell && !IsHoveringOnColumnCell))
+ {
+ Refresh();
+ }
+ }
base.OnMouseMove(e);
}
@@ -865,40 +945,40 @@ namespace BizHawk.Client.EmuHawk
}
if (e.Button == MouseButtons.Left)
+ {
+ if (IsHoveringOnColumnCell)
{
- if (IsHoveringOnColumnCell)
+ ColumnClickEvent(ColumnAtX(e.X));
+ }
+ else if (IsHoveringOnDataCell)
+ {
+ if (ModifierKeys == Keys.Alt)
{
- ColumnClickEvent(ColumnAtX(e.X));
+ MessageBox.Show("Alt click logic is not yet implemented");
}
- else if (IsHoveringOnDataCell)
+ else if (ModifierKeys == Keys.Shift)
{
- if (ModifierKeys == Keys.Alt)
+ if (SelectedItems.Any())
{
- MessageBox.Show("Alt click logic is not yet implemented");
- }
- else if (ModifierKeys == Keys.Shift)
- {
- if (SelectedItems.Any())
- {
- MessageBox.Show("Shift click logic is not yet implemented");
- }
- else
- {
- SelectCell(CurrentCell);
- }
- }
- else if (ModifierKeys == Keys.Control)
- {
- SelectCell(CurrentCell);
+ MessageBox.Show("Shift click logic is not yet implemented");
}
else
{
- SelectedItems.Clear();
SelectCell(CurrentCell);
}
-
- Refresh();
}
+ else if (ModifierKeys == Keys.Control)
+ {
+ SelectCell(CurrentCell);
+ }
+ else
+ {
+ SelectedItems.Clear();
+ SelectCell(CurrentCell);
+ }
+
+ Refresh();
+ }
}
base.OnMouseDown(e);
@@ -910,10 +990,10 @@ namespace BizHawk.Client.EmuHawk
RightButtonHeld = false;
base.OnMouseUp(e);
- }
+ }
private void IncrementScrollBar(ScrollBar bar, bool increment)
- {
+ {
int newVal;
if (increment)
{
@@ -921,13 +1001,13 @@ namespace BizHawk.Client.EmuHawk
if (newVal > bar.Maximum)
{
newVal = bar.Maximum;
- }
}
+ }
else
{
newVal = bar.Value - bar.SmallChange;
if (newVal < 0)
- {
+ {
newVal = 0;
}
}
@@ -958,6 +1038,22 @@ namespace BizHawk.Client.EmuHawk
}
}
+ private void DoRightMouseScroll(object sender, MouseEventArgs e)
+ {
+ if (RightMouseScrolled != null)
+ {
+ RightMouseScrolled(sender, e);
+ }
+ }
+
+ private void ColumnClickEvent(RollColumn column)
+ {
+ if (ColumnClick != null)
+ {
+ ColumnClick(this, new ColumnClickEventArgs(_columns.IndexOf(column)));
+ }
+ }
+
#endregion
#region Change Events
@@ -969,15 +1065,28 @@ namespace BizHawk.Client.EmuHawk
Refresh();
}
- #endregion
-
- #region Helpers
-
- private void DoRightMouseScroll(object sender, MouseEventArgs e)
+ private void OrientationChanged()
{
- if (RightMouseScrolled != null)
+ var temp = VBar.Clone();
+ VBar.Value = HBar.Value;
+ VBar.Maximum = HBar.Maximum;
+ VBar.Minimum = HBar.Minimum;
+ HBar.Value = temp.Value;
+ HBar.Maximum = temp.Maximum;
+ HBar.Minimum = temp.Minimum;
+ }
+ ///
+ /// Call this function to change the CurrentCell to newCell
+ ///
+ ///
+ ///
+ private void CellChanged(Cell newCell)
{
- RightMouseScrolled(sender, e);
+ if (PointedCellChanged != null && newCell != CurrentCell)
+ {
+ LastCell = CurrentCell;
+ CurrentCell = newCell;
+ PointedCellChanged(this, new CellEventArgs(LastCell, CurrentCell));
}
}
@@ -1002,6 +1111,10 @@ namespace BizHawk.Client.EmuHawk
RecalculateScrollBars();
}
+ #endregion
+
+ #region Helpers
+
private void RecalculateScrollBars()
{
if (NeedsVScrollbar)
@@ -1015,17 +1128,10 @@ namespace BizHawk.Client.EmuHawk
}
else
{
- max = (((ItemCount * CellHeight) - Height) / CellHeight) + 1;
+ max = (((RowCount * CellHeight) - Height) / CellHeight) + 1;
}
- if (VBar.Value > max)
- {
- _programmaticallyUpdatingScrollBarValues = true;
- VBar.Value = max;
- _programmaticallyUpdatingScrollBarValues = false;
- }
-
- VBar.Maximum = max + VBar.LargeChange; // TODO: why can't it be 1?
+ VBar.Maximum = max;// +VBar.LargeChange; // TODO: why can't it be 1?
VBar.Size = new Size(VBar.Width, Height);
VBar.Visible = true;
}
@@ -1039,11 +1145,21 @@ namespace BizHawk.Client.EmuHawk
HBar.Visible = true;
if (HorizontalOrientation)
{
- HBar.Maximum = (_columns.Sum(c => CalcWidth(c)) - Width) / CellWidth;
+ HBar.Maximum = ((RowCount * _horizontalOrientedColumnWidth)) / CellWidth;//TODO test this
}
else
{
- HBar.Maximum = ((ItemCount * CellWidth) - Width) / CellWidth;
+ HBar.Maximum = _columns.Sum(c => c.Width.Value) - Width;
+ }
+
+ if (NeedsVScrollbar)
+ {
+ HBar.Maximum += VBar.Width + 18;//TODO investigate this.
+ HBar.Size = new Size(Width - VBar.Width, HBar.Height);
+ }
+ else
+ {
+ HBar.Size = new Size(Width, HBar.Height);
}
}
else
@@ -1052,6 +1168,10 @@ namespace BizHawk.Client.EmuHawk
}
}
+ ///
+ /// If FullRowSelect is enabled, selects all cells in the row that contains the given cell. Otherwise only given cell is added.
+ ///
+ /// The cell to select.
private void SelectCell(Cell cell)
{
if (!MultiSelect)
@@ -1078,6 +1198,9 @@ namespace BizHawk.Client.EmuHawk
SelectedIndexChanged(this, new EventArgs());
}
+ ///
+ /// Bool that indicates if CurrentCell is a Column Cell.
+ ///
private bool IsHoveringOnColumnCell
{
get
@@ -1088,6 +1211,9 @@ namespace BizHawk.Client.EmuHawk
}
}
+ ///
+ /// Bool that indicates if CurrentCell is a Data Cell.
+ ///
private bool IsHoveringOnDataCell
{
get
@@ -1098,9 +1224,40 @@ namespace BizHawk.Client.EmuHawk
}
}
- private void CalculatePointedCell(int x, int y)
+ ///
+ /// Bool that indicates if CurrentCell is a Column Cell.
+ ///
+ private bool WasHoveringOnColumnCell
+ {
+ get
+ {
+ return LastCell != null &&
+ LastCell.Column != null &&
+ !LastCell.RowIndex.HasValue;
+ }
+ }
+
+ ///
+ /// Bool that indicates if CurrentCell is a Data Cell.
+ ///
+ private bool WasHoveringOnDataCell
+ {
+ get
+ {
+ return LastCell != null &&
+ LastCell.Column != null &&
+ LastCell.RowIndex.HasValue;
+ }
+ }
+
+ ///
+ /// Finds the specific cell that contains the (x, y) coordinate.
+ ///
+ /// X coordinate point.
+ /// Y coordinate point.
+ /// The cell with row number and RollColumn reference, both of which can be null.
+ private Cell CalculatePointedCell(int x, int y)
{
- bool wasHoveringColumnCell = IsHoveringOnColumnCell;
var newCell = new Cell();
// If pointing to a column header
@@ -1108,6 +1265,7 @@ namespace BizHawk.Client.EmuHawk
{
if (HorizontalOrientation)
{
+ //TODO: Test this branch
if (x < _horizontalOrientedColumnWidth)
{
newCell.RowIndex = null;
@@ -1127,64 +1285,24 @@ namespace BizHawk.Client.EmuHawk
{
if (y < CellHeight)
{
+ //Out of range or on columncell
newCell.RowIndex = null;
}
else
{
- newCell.RowIndex = (y / CellHeight) - 1;
+ newCell.RowIndex = (y / CellHeight) + VBar.Value - 1;
}
- int start = 0;
- //for (int i = 0; i < Columns.Count; i++)
- foreach (var column in _columns)
- {
- if (x > start)
- {
- start += CalcWidth(column);
- if (x <= start)
- {
- newCell.Column = column;
- break;
- }
- }
- }
- }
- }
-
- if (!newCell.Equals(CurrentCell))
- {
- CellChanged(CurrentCell, newCell);
- LastCell = CurrentCell;
- CurrentCell = newCell;
-
- if (IsHoveringOnColumnCell ||
- (wasHoveringColumnCell && !IsHoveringOnColumnCell))
- {
- Refresh();
+ newCell.Column = ColumnAtX(x);
}
}
+ return newCell;
}
- private void CellChanged(Cell oldCell, Cell newCell)
- {
- if (PointedCellChanged != null)
- {
- PointedCellChanged(this, new CellEventArgs(oldCell, newCell));
- }
- }
-
- private void ColumnClickEvent(RollColumn column)
- {
- if (ColumnClick != null)
- {
- ColumnClick(this, new ColumnClickEventArgs(_columns.IndexOf(column)));
- }
- }
-
- private bool NeedToUpdateScrollbar()
- {
- return true;
- }
+ //private bool NeedToUpdateScrollbar()
+ //{
+ // return true;
+ //}
// TODO: Calculate this on Orientation change instead of call it every time
private Point StartBg()
@@ -1208,6 +1326,9 @@ namespace BizHawk.Client.EmuHawk
}
// TODO: calculate this on Cell Padding change instead of calculate it every time
+ ///
+ /// The height of a cell. Only can be changed by changing the Font or CellPadding.
+ ///
private int CellHeight
{
get
@@ -1217,6 +1338,9 @@ namespace BizHawk.Client.EmuHawk
}
// TODO: calculate this on Cell Padding change instead of calculate it every time
+ ///
+ /// The width of a cell. Only can be changed by changing the Font or CellPadding.
+ ///
private int CellWidth
{
get
@@ -1225,6 +1349,9 @@ namespace BizHawk.Client.EmuHawk
}
}
+ ///
+ /// A boolean that indicates if the InputRoll is too large vertically and requires a vertical scrollbar.
+ ///
private bool NeedsVScrollbar
{
get
@@ -1234,42 +1361,54 @@ namespace BizHawk.Client.EmuHawk
return _columns.Count > Height / CellHeight;
}
- return ItemCount > Height / CellHeight;
+ return RowCount > Height / CellHeight;
}
}
+ ///
+ /// A boolean that indicates if the InputRoll is too large horizontally and requires a horizontal scrollbar.
+ ///
private bool NeedsHScrollbar
{
get
{
if (HorizontalOrientation)
{
- return ItemCount > (Width - _horizontalOrientedColumnWidth) / CellWidth;
+ return RowCount > (Width - _horizontalOrientedColumnWidth) / CellWidth;
}
- return _columns.Sum(column => CalcWidth(column)) > Width;
+ return _columns.Sum(column => column.Width.Value) > Width;
}
}
- private void ColumnChanged()
+ //private void ColumnChanged()
+ //{
+ // var text = _columns.Max(c => c.Text.Length);
+ // _horizontalOrientedColumnWidth = (text * _charSize.Width) + (CellPadding * 2);
+ //}
+
+ ///
+ /// Updates the width of the supplied column.
+ /// Call when changing the ColumnCell text, CellPadding, or text font.
+ ///
+ /// The RollColumn object to update.
+ /// The new width of the RollColumn object.
+ private int UpdateWidth(RollColumn col)
{
- var text = _columns.Max(c => c.Text.Length);
- _horizontalOrientedColumnWidth = (text * _charSize.Width) + (CellPadding * 2);
- }
-
- // On Column Change calculate this for every column
- private int CalcWidth(RollColumn col)
- {
- return col.Width ?? ((col.Text.Length * _charSize.Width) + (CellPadding * 4));
+ col.Width = ((col.Text.Length * _charSize.Width) + (CellPadding * 4));
+ return col.Width.Value;
}
+ ///
+ /// Returns the RollColumn object at the specified visible x coordinate. Coordinate should be between 0 and Width of the InputRoll Control.
+ ///
+ /// The x coordinate.
+ /// RollColumn object that contains the x coordinate or null if none exists.
private RollColumn ColumnAtX(int x)
{
- int start = 0;
foreach (var column in _columns)
{
- start += CalcWidth(column);
- if (start > x)
+ if (column.Left.Value - HBar.Value <= x && column.Right.Value - HBar.Value >= x)
{
return column;
}
@@ -1302,6 +1441,18 @@ namespace BizHawk.Client.EmuHawk
}
}
+ private void ColumnsChanged()
+ {
+ int pos = 0;
+ for (int i = 0; i < Count; i++)
+ {
+ this[i].Left = pos;
+ pos += this[i].Width.Value;
+ this[i].Right = pos;
+ }
+ DoChangeCallback();
+ }
+
public new void Add(RollColumn column)
{
if (this.Any(c => c.Name == column.Name))
@@ -1312,7 +1463,7 @@ namespace BizHawk.Client.EmuHawk
}
base.Add(column);
- ChangedCallback();
+ ColumnsChanged();
}
public new void AddRange(IEnumerable collection)
@@ -1329,7 +1480,7 @@ namespace BizHawk.Client.EmuHawk
}
base.AddRange(collection);
- ChangedCallback();
+ ColumnsChanged();
}
public new void Insert(int index, RollColumn column)
@@ -1340,7 +1491,7 @@ namespace BizHawk.Client.EmuHawk
}
base.Insert(index, column);
- ChangedCallback();
+ ColumnsChanged();
}
public new void InsertRange(int index, IEnumerable collection)
@@ -1354,39 +1505,39 @@ namespace BizHawk.Client.EmuHawk
}
base.InsertRange(index, collection);
- ChangedCallback();
+ ColumnsChanged();
}
public new bool Remove(RollColumn column)
{
var result = base.Remove(column);
- ChangedCallback();
+ ColumnsChanged();
return result;
}
public new int RemoveAll(Predicate match)
{
var result = base.RemoveAll(match);
- ChangedCallback();
+ ColumnsChanged();
return result;
}
public new void RemoveAt(int index)
{
base.RemoveAt(index);
- ChangedCallback();
+ ColumnsChanged();
}
public new void RemoveRange(int index, int count)
{
base.RemoveRange(index, count);
- ChangedCallback();
+ ColumnsChanged();
}
public new void Clear()
{
base.Clear();
- ChangedCallback();
+ ColumnsChanged();
}
public IEnumerable Groups
@@ -1406,15 +1557,21 @@ namespace BizHawk.Client.EmuHawk
public string Group { get; set; }
public int? Width { get; set; }
+ public int? Left { get; set; }
+ public int? Right { get; set; }
public string Name { get; set; }
public string Text { get; set; }
public InputType Type { get; set; }
}
+ ///
+ ///
+ ///
public class Cell
{
- public RollColumn Column { get; set; }
- public int? RowIndex { get; set; }
+ public RollColumn Column { get; internal set; }
+ public int? RowIndex { get; internal set; }
+ public string CurrentText { get; internal set; }
public Cell() { }
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.Designer.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.Designer.cs
index 13b63a0171..3db4399f09 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.Designer.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.Designer.cs
@@ -66,8 +66,8 @@
this.MarkerView.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.MarkerView.FullRowSelect = true;
this.MarkerView.HorizontalOrientation = false;
- this.MarkerView.ItemCount = 0;
- this.MarkerView.LastVisibleIndex = 9;
+ this.MarkerView.RowCount = 0;
+ this.MarkerView.LastVisibleRow = 9;
this.MarkerView.Location = new System.Drawing.Point(3, 0);
this.MarkerView.MultiSelect = false;
this.MarkerView.Name = "MarkerView";
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs
index 25e21aea0b..8dfe0d9cb5 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs
@@ -98,7 +98,7 @@ namespace BizHawk.Client.EmuHawk
{
if (MarkerView != null && Markers != null)
{
- MarkerView.ItemCount = Markers.Count;
+ MarkerView.RowCount = Markers.Count;
}
MarkerView.Refresh();
@@ -120,7 +120,7 @@ namespace BizHawk.Client.EmuHawk
{
get
{
- return MarkerView.SelectedIndices
+ return MarkerView.SelectedRows
.OfType();
}
}
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs
index 731571e4b4..8b0b028128 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs
@@ -698,8 +698,8 @@ namespace BizHawk.Client.EmuHawk
this.TasView.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TasView.FullRowSelect = true;
this.TasView.HorizontalOrientation = false;
- this.TasView.ItemCount = 0;
- this.TasView.LastVisibleIndex = 22;
+ this.TasView.RowCount = 0;
+ this.TasView.LastVisibleRow = 22;
this.TasView.Location = new System.Drawing.Point(8, 27);
this.TasView.MultiSelect = true;
this.TasView.Name = "TasView";
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs
index 10010bcaab..c1ef25d4d3 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs
@@ -7,23 +7,18 @@ namespace BizHawk.Client.EmuHawk
{
public void UpdateValues()
{
- if (!IsHandleCreated || IsDisposed)
- {
- return;
- }
-
- if (_currentTasMovie == null)
+ if (!IsHandleCreated || IsDisposed || _currentTasMovie == null)
{
return;
}
if (_currentTasMovie.IsRecording)
{
- TasView.LastVisibleIndex = _currentTasMovie.InputLogLength - 1;
+ TasView.LastVisibleRow = _currentTasMovie.InputLogLength - 1;
}
else
{
- TasView.LastVisibleIndex = Global.Emulator.Frame;
+ TasView.LastVisibleRow = Global.Emulator.Frame;
}
RefreshDialog();
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
index c480bd180e..59462b2241 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
@@ -164,7 +164,7 @@ namespace BizHawk.Client.EmuHawk
private void TasView_ColumnClick(object sender, ColumnClickEventArgs e)
{
- if (TasView.SelectedIndices.Any())
+ if (TasView.SelectedRows.Any())
{
var columnName = TasView.Columns[e.Column].Name;
@@ -174,7 +174,7 @@ namespace BizHawk.Client.EmuHawk
}
else if (columnName != MarkerColumnName) // TODO: what about float?
{
- foreach (var index in TasView.SelectedIndices)
+ foreach (var index in TasView.SelectedRows)
{
ToggleBoolState(index, columnName);
}
@@ -230,10 +230,10 @@ namespace BizHawk.Client.EmuHawk
{
var frame = TasView.CurrentCell.RowIndex.Value;
var buttonName = TasView.CurrentCell.Column.Name;
- if (TasView.SelectedIndices.IndexOf(frame) != -1 && (buttonName == MarkerColumnName || buttonName == FrameColumnName))
+ if (TasView.SelectedRows.IndexOf(frame) != -1 && (buttonName == MarkerColumnName || buttonName == FrameColumnName))
{
//Disable the option to remove markers if no markers are selected (FCUEX does this).
- RemoveMarkersContextMenuItem.Enabled = _currentTasMovie.Markers.Any(m => TasView.SelectedIndices.Contains(m.Frame));
+ RemoveMarkersContextMenuItem.Enabled = _currentTasMovie.Markers.Any(m => TasView.SelectedRows.Contains(m.Frame));
RightClickMenu.Show(TasView, e.X, e.Y);
}
}
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
index fef942ad6b..8c3fd1ae06 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
@@ -156,8 +156,7 @@ namespace BizHawk.Client.EmuHawk
{
_currentTasMovie.FlushInputCache();
_currentTasMovie.UseInputCache = true;
-
- TasView.ItemCount = _currentTasMovie.InputLogLength + 1;
+ TasView.RowCount = _currentTasMovie.InputLogLength + 1;
TasView.Refresh();
_currentTasMovie.FlushInputCache();
@@ -270,7 +269,7 @@ namespace BizHawk.Client.EmuHawk
}
GlobalWin.DisplayManager.NeedsToPaint = true;
- TasView.LastVisibleIndex = frame;
+ TasView.LastVisibleRow = frame;
}
else // Get as close as we can then emulate there
{
@@ -294,7 +293,7 @@ namespace BizHawk.Client.EmuHawk
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(_currentTasMovie[goToFrame].State.ToArray())));
Global.Emulator.FrameAdvance(true);
GlobalWin.DisplayManager.NeedsToPaint = true;
- TasView.LastVisibleIndex = frame;
+ TasView.LastVisibleRow = frame;
}
else
{
@@ -373,7 +372,7 @@ namespace BizHawk.Client.EmuHawk
{
// TODO: columns selected
// TODO: clipboard
- var list = TasView.SelectedIndices;
+ var list = TasView.SelectedRows;
string message = "Selected: ";
if (list.Count > 0)
@@ -541,7 +540,7 @@ namespace BizHawk.Client.EmuHawk
DeleteFramesMenuItem.Enabled =
CloneMenuItem.Enabled =
TruncateMenuItem.Enabled =
- TasView.SelectedIndices.Any();
+ TasView.SelectedRows.Any();
ReselectClipboardMenuItem.Enabled =
PasteMenuItem.Enabled =
PasteInsertMenuItem.Enabled =
@@ -560,7 +559,7 @@ namespace BizHawk.Client.EmuHawk
private void SelectBetweenMarkersMenuItem_Click(object sender, EventArgs e)
{
- if (TasView.SelectedIndices.Any())
+ if (TasView.SelectedRows.Any())
{
var prevMarker = _currentTasMovie.Markers.PreviousOrCurrent(TasView.LastSelectedIndex.Value);
var nextMarker = _currentTasMovie.Markers.Next(TasView.LastSelectedIndex.Value);
@@ -586,10 +585,10 @@ namespace BizHawk.Client.EmuHawk
private void CopyMenuItem_Click(object sender, EventArgs e)
{
- if (TasView.SelectedIndices.Any())
+ if (TasView.SelectedRows.Any())
{
_tasClipboard.Clear();
- var list = TasView.SelectedIndices;
+ var list = TasView.SelectedRows;
var sb = new StringBuilder();
for (var i = 0; i < list.Count; i++)
{
@@ -648,13 +647,13 @@ namespace BizHawk.Client.EmuHawk
private void CutMenuItem_Click(object sender, EventArgs e)
{
- if (TasView.SelectedIndices.Any())
+ if (TasView.SelectedRows.Any())
{
var needsToRollback = !(TasView.FirstSelectedIndex.Value > Global.Emulator.Frame);
var rollBackFrame = TasView.FirstSelectedIndex.Value;
_tasClipboard.Clear();
- var list = TasView.SelectedIndices.ToArray();
+ var list = TasView.SelectedRows.ToArray();
var sb = new StringBuilder();
for (var i = 0; i < list.Length; i++)
{
@@ -683,12 +682,12 @@ namespace BizHawk.Client.EmuHawk
private void ClearMenuItem_Click(object sender, EventArgs e)
{
- if (TasView.SelectedIndices.Any())
+ if (TasView.SelectedRows.Any())
{
var needsToRollback = !(TasView.FirstSelectedIndex > Global.Emulator.Frame);
var rollBackFrame = TasView.FirstSelectedIndex.Value;
- foreach (var frame in TasView.SelectedIndices)
+ foreach (var frame in TasView.SelectedRows)
{
_currentTasMovie.ClearFrame(frame);
}
@@ -706,13 +705,13 @@ namespace BizHawk.Client.EmuHawk
private void DeleteFramesMenuItem_Click(object sender, EventArgs e)
{
- if (TasView.SelectedIndices.Any())
+ if (TasView.SelectedRows.Any())
{
var needsToRollback = !(TasView.FirstSelectedIndex > Global.Emulator.Frame);
var rollBackFrame = TasView.FirstSelectedIndex.Value;
_tasClipboard.Clear();
- _currentTasMovie.RemoveFrames(TasView.SelectedIndices.ToArray());
+ _currentTasMovie.RemoveFrames(TasView.SelectedRows.ToArray());
SetSplicer();
TasView.DeselectAll();
@@ -729,9 +728,9 @@ namespace BizHawk.Client.EmuHawk
private void CloneMenuItem_Click(object sender, EventArgs e)
{
- if (TasView.SelectedIndices.Any())
+ if (TasView.SelectedRows.Any())
{
- var framesToInsert = TasView.SelectedIndices.ToList();
+ var framesToInsert = TasView.SelectedRows.ToList();
var insertionFrame = TasView.LastSelectedIndex.Value + 1;
var needsToRollback = !(insertionFrame > Global.Emulator.Frame);
var inputLog = new List();
@@ -756,7 +755,7 @@ namespace BizHawk.Client.EmuHawk
private void InsertFrameMenuItem_Click(object sender, EventArgs e)
{
- var insertionFrame = TasView.SelectedIndices.Any() ? TasView.FirstSelectedIndex.Value : 0;
+ var insertionFrame = TasView.SelectedRows.Any() ? TasView.FirstSelectedIndex.Value : 0;
bool needsToRollback = insertionFrame <= Global.Emulator.Frame;
_currentTasMovie.InsertEmptyFrame(insertionFrame);
@@ -773,7 +772,7 @@ namespace BizHawk.Client.EmuHawk
private void InsertNumFramesMenuItem_Click(object sender, EventArgs e)
{
- var insertionFrame = TasView.SelectedIndices.Any() ? TasView.FirstSelectedIndex.Value : 0;
+ var insertionFrame = TasView.SelectedRows.Any() ? TasView.FirstSelectedIndex.Value : 0;
bool needsToRollback = insertionFrame <= Global.Emulator.Frame;
var framesPrompt = new FramesPrompt();
@@ -795,7 +794,7 @@ namespace BizHawk.Client.EmuHawk
private void TruncateMenuItem_Click(object sender, EventArgs e)
{
- if (TasView.SelectedIndices.Any())
+ if (TasView.SelectedRows.Any())
{
var rollbackFrame = TasView.LastSelectedIndex.Value + 1;
var needsToRollback = !(rollbackFrame > Global.Emulator.Frame);
@@ -815,7 +814,7 @@ namespace BizHawk.Client.EmuHawk
private void SetMarkersMenuItem_Click(object sender, EventArgs e)
{
- foreach(int index in TasView.SelectedIndices)
+ foreach(int index in TasView.SelectedRows)
{
CallAddMarkerPopUp(index);
}
@@ -823,7 +822,7 @@ namespace BizHawk.Client.EmuHawk
private void RemoveMarkersMenuItem_Click(object sender, EventArgs e)
{
- _currentTasMovie.Markers.RemoveAll(m => TasView.SelectedIndices.Contains(m.Frame));
+ _currentTasMovie.Markers.RemoveAll(m => TasView.SelectedRows.Contains(m.Frame));
RefreshDialog();
}