This repository has been archived on 2024-08-06. You can view files and clone it, but cannot push or open issues or pull requests.
linear-app-launcher/Windows/Forms/Tile/TileLayoutPanel.cs

273 lines
6.9 KiB
C#
Raw Normal View History

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;
}
}
}