2023-11-18 12:33:05 -05:00

206 lines
6.8 KiB
C#

using GraphicsManager.Enums;
using GraphicsManager.Interfaces;
using GraphicsManager.Objects;
using Luski.GUI.MainScreen.Interfaces;
using Luski.net.Structures.Public;
using OpenTK.Windowing.Common.Input;
namespace Luski.GUI.MainScreen.UI.PublicServers;
public class Category : UserControl, IChannelAdder
{
public FlowLayout Members;
public SocketCategory CurrentCategory { get; set; }
private List<Category> cc = new();
private List<Channel> cl = new();
private Label ee;
private ChannelSelector CS;
public event Func<int, Task>? AddY;
private Label Name;
public UserControl tmp;
public static Task<Category> MakeCat(SocketCategory cat, ChannelSelector cs)
{
Category c = new();
c.CurrentCategory = cat;
c.CS = cs;
c.Anchor = ObjectAnchor.All;
c.Size = new((int)(307 * Globals.Settings.Scale), (int)(40* Globals.Settings.Scale));
c.tmp = new()
{
Size = c.Size,
Anchor = ObjectAnchor.Top | ObjectAnchor.Left,
IgnoreHover = true
};
c.tmp.Clicked += c.TmpOnClicked;
c.tmp.HoverMouse = MouseCursor.Hand;
c.Controls.Add(c.tmp);
c.tmp.Controls.Add(c.ee = new(Globals.DefaultFont)
{
Text = ">",
Location = new((int)(5*Globals.Settings.Scale)),
Color = cat.Color.ToColor4(),
DIR = new(1,0),
IgnoreHover = true
});
c.tmp.Controls.Add(c.Name = new Label(Globals.DefaultFont)
{
Text = cat.Name,
Color = c.ee.Color,
IgnoreHover = true
});
c.Clicked += c.AllOnClicked;
c.Name.Location = new((int)(26 * Globals.Settings.Scale), ((c.Size.Y/2) - (c.Name.TrueHeight/ 2) - (c.Name.Size.Y - c.Name.TrueHeight)), 0);
c.Members = new()
{
Anchor = ObjectAnchor.All,
Location = new((int)(20 * Globals.Settings.Scale), c.Size.Y, 0),
IgnoreHover = true
};
c.ee.Location = new(c.ee.Location.X, c.Name.Location.Y, 0);
c.Members.Size = new(c.Size.X - c.Members.Location.X, 0);
c.Controls.Add(c.Members);
c.Members.ForceDistanceUpdate(c);
c.tmp.HoverMouse = MouseCursor.Hand;
return Task.FromResult(c);
}
private Category()
{
}
private async Task TmpOnClicked(IRenderObject arg)
{
BlockDraw = true;
if (!Extended)
{
DateTime dt = DateTime.UtcNow;
SocketChannel[] Channels = await CurrentCategory.GetChannels();
Console.WriteLine(DateTime.UtcNow - dt);
foreach (SocketChannel v in Channels)
{
Channel c = await AddChannel(v);
c.LoadToParent(Members, Window!);
_ = CatOnAddY(c.Size.Y);
}
Console.WriteLine(DateTime.UtcNow - dt);
SocketCategory[] cats = await CurrentCategory.GetCategories();
Console.WriteLine(DateTime.UtcNow - dt);
foreach (SocketCategory v in cats)
{
var c = await AddCategory(v, dt);
c.LoadToParent(Members, Window!);
_ = CatOnAddY(c.Size.Y);
}
Console.WriteLine(DateTime.UtcNow - dt);
}
else
{
if (AddY is not null) await AddY.Invoke(-Members.Size.Y);
this.Size = new(this.Size.X, this.Size.Y -Members.Size.Y);
Members.Size = new(Members.Size.X, 0);
//Members.Controls.Clear(false);
}
BlockDraw = false;
Extended = !Extended;
Window!.ForceUpdate(new(Window.Size));
}
private bool e;
public bool Extended
{
get => e;
set
{
if (value)
{
ee.DIR = new(0,1);
ee.Location = new(ee.Location.X, (ee.Location.Y - ee.PostiveTrueHeight), 0);
}
else
{
ee.DIR = new(1,0);
ee.Location = new(ee.Location.X, (ee.Location.Y + ee.PostiveTrueHeight), 0);
}
e = value;
}
}
private Task AllOnClicked(IRenderObject arg)
{
if (ClickCon is not null) _ = ClickCon.Invoke(this);
return Task.CompletedTask;
}
public event Func<Category, Task>? ClickCon;
public async Task<Category> AddCategory(SocketCategory Cat, DateTime? dt = null)
{
if (dt is not null) Console.WriteLine("c: {0}",DateTime.UtcNow - dt);
Category[] tc = cc.Where(s => s.CurrentCategory.ID == Cat.ID).ToArray();
if (dt is not null) Console.WriteLine("c: {0}",DateTime.UtcNow - dt);
if (tc.Length > 0)
{
if (dt is not null) Console.WriteLine("c: {0}",DateTime.UtcNow - dt);
var cat2 = tc[0];
if (!Members.Controls.Contains(cat2))
{
if (dt is not null) Console.WriteLine("c: {0}",DateTime.UtcNow - dt);
Members.Controls.Add(cat2);
if (dt is not null) Console.WriteLine("c: {0}",DateTime.UtcNow - dt);
//Size = new(Size.X, Size.Y + cat2.Size.Y);
_ = CatOnAddY(cat2.Size.Y);
if (dt is not null) Console.WriteLine("c: {0}",DateTime.UtcNow - dt);
if (AddY is not null) _ = AddY.Invoke(cat2.Size.Y);
if (dt is not null) Console.WriteLine("c: {0}",DateTime.UtcNow - dt);
}
return cat2;
}
var cat = await Category.MakeCat(Cat, CS);
cc.Add(cat);
Members.Controls.Add(cat);
cat.Size = new(this.Size.X, cat.Size.Y);
cat.Members.BackgroundColor = BackgroundColor;
cat.BackgroundColor = BackgroundColor;
cat.tmp.BackgroundColor = BackgroundColor;
Size = new(Size.X, Size.Y + cat.Size.Y);
cat.AddY += CatOnAddY;
if (AddY is not null) await AddY.Invoke(cat.Size.Y);
return cat;
}
private async Task CatOnAddY(int arg)
{
this.Size = new(Size.X, Size.Y + arg);
}
public async Task<Channel> AddChannel(SocketChannel chan)
{
Channel[] tc = cl.Where(s => s.CurrentChannel.ID == chan.ID).ToArray();
if (tc.Length > 0)
{
Channel cat2 = tc[0];
if (!Members.Controls.Contains(cat2))
{
Members.Controls.Add(cat2);
Size = new(Size.X, Size.Y + cat2.Size.Y);
if (AddY is not null) _ = AddY.Invoke(cat2.Size.Y);
}
return cat2;
}
Channel cat = await Channel.MakeChannel(chan, CS);
cl.Add(cat);
cat.BackgroundColor = BackgroundColor;
Size = new(Size.X, Size.Y + cat.Size.Y);
Members.Controls.Add(cat);
if (AddY is not null) await AddY.Invoke(cat.Size.Y);
return cat;
}
}