private void Grid_MouseMove(object sender, MouseEventArgs e)
{
Point p = e.Location;
if (m_dragging)
{
m_deltaX = p.X - m_lastMousePosition.X;
m_deltaY = p.Y - m_lastMousePosition.Y;
m_offsetX += m_deltaX;
m_offsetY += m_deltaY;
selection.X += m_deltaX;
selection.Y += m_deltaY;
// I changed this from ceiling to Floor. It made more sense to me to have this represent the # of
// whole cells offset from the viewport and not to include a partial cell in this. It shouldn't be too
// hard to flip this in the other direction, if you wanted tho.
m_cellOffsetX = m_offsetX / m_cellSize;
m_cellOffsetY = (int)System.Math.Floor((double)m_offsetY / (double)m_cellSize);
m_lastMousePosition = (e.Location);
Invalidate();
}
if (m_selecting && m_multiSelect)
{
// TODO: Improved pointer tracking
m_selectDeltaX = p.X - m_lastSelectMousePosition.X;
m_selectDeltaY = p.Y - m_lastSelectMousePosition.Y;
m_selectionOffsetX += m_selectDeltaX;
m_selectionOffsetY += m_selectDeltaY;
selection.Height = System.Math.Abs(m_cellSize + m_selectionOffsetY + m_selectDeltaY);
selection.Width = System.Math.Abs(m_cellSize + m_selectionOffsetX + m_selectDeltaX);
selection.X = System.Math.Min(m_selectionStartX, m_selectionStartX + m_cellSize + m_selectionOffsetX + m_selectDeltaX);
selection.Y = System.Math.Min(m_selectionStartY, m_selectionStartY + m_cellSize + m_selectionOffsetY + m_selectDeltaY);
m_lastSelectMousePosition = e.Location;
Invalidate();
}
if(m_selecting && !m_multiSelect)
{
m_lastMousePosition = (e.Location);
m_lastSelectMousePosition = e.Location;
m_selectDeltaX = 0;
m_selectionOffsetX = 0;
m_selectDeltaY = 0;
m_selectionOffsetY = 0;
m_selectedX = GetCellX(e.Location);
m_selectedY = GetCellY(e.Location);
var cellX = (int)System.Math.Floor((((double)m_mouseOffsetX) / ((double)m_cellSize)));
var cellY = (int)System.Math.Floor((((double)m_mouseOffsetY) / ((double)m_cellSize)));
m_selectionStartX = cellX * m_cellSize + GetPartialCellSizeX();
m_selectionStartY = cellY * m_cellSize + GetPartialCellSizeY();
selection = new Rectangle(m_selectionStartX, m_selectionStartY, m_cellSize, m_cellSize);
if (SelectionMade != null)
{
SelectionMade(new Rectangle(m_selectedX, m_selectedY, 1, 1));
}
Invalidate();
}
}