2020-04-11 17:43:20 +00:00
|
|
|
|
using AppLauncher.Models;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
|
|
|
|
namespace AppLauncher.Windows.Forms
|
|
|
|
|
{
|
|
|
|
|
public class TileLayoutPanel : AUserControl
|
|
|
|
|
{
|
|
|
|
|
public class Item
|
|
|
|
|
{
|
|
|
|
|
public TilePanel Tile { get; set; }
|
|
|
|
|
public Point Coord { get; set; } = new Point(0, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected readonly int tileSize = 70;
|
|
|
|
|
protected readonly int margin = 3;
|
|
|
|
|
|
|
|
|
|
protected int collapseHeight = 0;
|
|
|
|
|
protected int expandedHeight = 0;
|
|
|
|
|
|
|
|
|
|
protected List<Item> items = new List<Item>();
|
|
|
|
|
|
|
|
|
|
public TileLayoutPanel() : base()
|
|
|
|
|
{
|
|
|
|
|
this.BackColor = System.Drawing.Color.Transparent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnLoad(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnLoad(e);
|
|
|
|
|
|
|
|
|
|
OnResize(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Point GridSize
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
int w = (int)Math.Floor(decimal.Divide(this.Width, this.TileSize));
|
|
|
|
|
int h = (int)Math.Floor(decimal.Divide(this.Height, this.TileSize));
|
|
|
|
|
|
|
|
|
|
return new Point(w, h);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int TileSize => (tileSize + margin);
|
|
|
|
|
|
|
|
|
|
public int CollapseHeight => collapseHeight;
|
|
|
|
|
|
|
|
|
|
public int ExpandedHeight => expandedHeight;
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
public void AddTile(TileModel tile)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-11 17:43:20 +00:00
|
|
|
|
public void Clear()
|
|
|
|
|
{
|
|
|
|
|
this.Controls.Clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//public Point GetTileCoord(Point location) => this.GetTileCoord(location.X, location.Y);
|
|
|
|
|
|
|
|
|
|
//public Point GetTileCoord(int posX, int posY)
|
|
|
|
|
//{
|
|
|
|
|
// int x = (int)Math.Round(decimal.Divide(posX, this.TileSize));
|
|
|
|
|
// int y = (int)Math.Round(decimal.Divide(posY, this.TileSize));
|
|
|
|
|
|
|
|
|
|
// if (x < 0) x = 0;
|
|
|
|
|
// if (y < 0) y = 0;
|
|
|
|
|
|
|
|
|
|
// return new Point(x, y);
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//public Point GetTilePosition(Point location) => this.GetTilePosition(location.X, location.Y);
|
|
|
|
|
|
|
|
|
|
public Point GetTilePosition(int posX, int posY)
|
|
|
|
|
{
|
|
|
|
|
int x = (int)Math.Round(decimal.Divide(posX, this.TileSize));
|
|
|
|
|
int y = (int)Math.Round(decimal.Divide(posY, this.TileSize));
|
|
|
|
|
|
|
|
|
|
if (x < 0) x = 0;
|
|
|
|
|
if (y < 0) y = 0;
|
|
|
|
|
|
|
|
|
|
return new Point((x * this.TileSize), (y * this.TileSize));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void LoadTiles(List<TileModel> tiles)
|
|
|
|
|
{
|
|
|
|
|
if (tiles == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tiles.Count() <= 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (TileModel item in tiles)
|
|
|
|
|
{
|
|
|
|
|
// resolve final grid position
|
2020-05-02 16:17:10 +00:00
|
|
|
|
Point? confirmedPosition = resolveCoord(item.Position);
|
2020-04-11 17:43:20 +00:00
|
|
|
|
if (confirmedPosition == null)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// place control
|
|
|
|
|
TilePanel panel = new TilePanel();
|
|
|
|
|
panel.LoadInfo(item);
|
2020-05-02 16:17:10 +00:00
|
|
|
|
panel.Location = convertCoordToLocation(confirmedPosition.Value);
|
2020-04-11 17:43:20 +00:00
|
|
|
|
|
|
|
|
|
items.Add(new Item()
|
|
|
|
|
{
|
|
|
|
|
Tile = panel,
|
|
|
|
|
Coord = confirmedPosition.Value
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.Controls.Add(panel);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void MoveTile(TilePanel panel, int posX, int posY)
|
|
|
|
|
{
|
2020-04-12 00:12:21 +00:00
|
|
|
|
Item item = items.Where(x => x.Tile.Equals(panel)).FirstOrDefault();
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-04-11 17:43:20 +00:00
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
Point newPosition = convertLocationToCoord(posX, posY);
|
2020-04-12 00:12:21 +00:00
|
|
|
|
if (!isTileInBounds(newPosition))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-04-11 17:43:20 +00:00
|
|
|
|
|
2020-04-12 00:12:21 +00:00
|
|
|
|
if (hasTile(newPosition))
|
|
|
|
|
{
|
|
|
|
|
Item swapItem = items.Where(x => x.Coord.Equals(newPosition)).FirstOrDefault();
|
|
|
|
|
if (swapItem != null)
|
|
|
|
|
{
|
|
|
|
|
swapItem.Coord = item.Coord;
|
2020-05-02 16:17:10 +00:00
|
|
|
|
swapItem.Tile.Location = convertCoordToLocation(item.Coord);
|
2020-04-12 00:12:21 +00:00
|
|
|
|
}
|
2020-04-11 17:43:20 +00:00
|
|
|
|
|
2020-04-12 00:12:21 +00:00
|
|
|
|
item.Coord = newPosition;
|
2020-05-02 16:17:10 +00:00
|
|
|
|
panel.Location = convertCoordToLocation(newPosition);
|
2020-04-12 00:12:21 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
item.Coord = newPosition;
|
2020-05-02 16:17:10 +00:00
|
|
|
|
panel.Location = convertCoordToLocation(newPosition);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Remove(TilePanel panel)
|
|
|
|
|
{
|
|
|
|
|
Item m = items.Where(x => x.Tile.Equals(panel)).FirstOrDefault();
|
|
|
|
|
if (m != null)
|
|
|
|
|
{
|
|
|
|
|
items.Remove(m);
|
2020-04-12 00:12:21 +00:00
|
|
|
|
}
|
2020-05-02 16:17:10 +00:00
|
|
|
|
|
|
|
|
|
this.Controls.Remove(panel);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetGridSize(int width, int height)
|
|
|
|
|
{
|
|
|
|
|
expandedHeight = (this.TileSize * height);
|
|
|
|
|
|
|
|
|
|
this.Size = new Size((this.TileSize * width), expandedHeight);
|
2020-04-11 17:43:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
protected Point convertCoordToLocation(Point position) => new Point((position.X * this.TileSize), (position.Y * this.TileSize));
|
2020-04-11 17:43:20 +00:00
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
protected Point convertLocationToCoord(int posX, int posY)
|
2020-04-12 00:12:21 +00:00
|
|
|
|
{
|
|
|
|
|
int x = (int)Math.Round(decimal.Divide(posX, this.TileSize));
|
|
|
|
|
int y = (int)Math.Round(decimal.Divide(posY, this.TileSize));
|
|
|
|
|
|
|
|
|
|
if (x < 0) x = 0;
|
|
|
|
|
if (y < 0) y = 0;
|
|
|
|
|
|
|
|
|
|
return new Point(x, y);
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
protected Point? resolveCoord(Point coord)
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
2020-05-02 16:17:10 +00:00
|
|
|
|
if (!isTileInBounds(coord))
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
if (!hasTile(coord))
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
2020-05-02 16:17:10 +00:00
|
|
|
|
return coord;
|
2020-04-11 17:43:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
return resolveNextCoord(coord);
|
2020-04-11 17:43:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
protected Point? resolveNextCoord(Point coord)
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
|
|
|
|
Point gridSize = this.GridSize;
|
2020-05-02 16:17:10 +00:00
|
|
|
|
Point newCoord = coord;
|
2020-04-11 17:43:20 +00:00
|
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2020-05-02 16:17:10 +00:00
|
|
|
|
newCoord.X++;
|
2020-04-11 17:43:20 +00:00
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
if (newCoord.X >= gridSize.X)
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
2020-05-02 16:17:10 +00:00
|
|
|
|
newCoord.Y++;
|
|
|
|
|
newCoord.X = 0;
|
2020-04-11 17:43:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
if (!isTileInBounds(newCoord))
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
if (hasTile(newCoord))
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-02 16:17:10 +00:00
|
|
|
|
return newCoord;
|
2020-04-11 17:43:20 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected bool hasTile(Point position)
|
|
|
|
|
{
|
|
|
|
|
if (items == null)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (items.Count <= 0)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (items.Count(x => x.Coord.Equals(position)) > 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected bool isTileInBounds(Point position)
|
|
|
|
|
{
|
|
|
|
|
Point gridSize = this.GridSize;
|
|
|
|
|
|
2020-04-12 00:12:21 +00:00
|
|
|
|
if (position.X >= gridSize.X)
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 00:12:21 +00:00
|
|
|
|
if (position.Y >= gridSize.Y)
|
2020-04-11 17:43:20 +00:00
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|