Compare commits

..

2 Commits

Author SHA1 Message Date
dff9100cf0 Rendering Improvements
New subframes.
Working on better-centered content.
2024-10-11 16:36:16 -04:00
0b2bfe1635 More settings
Some settings can now be represented as a number slider.
Floating point values have lag but work.
2024-09-28 19:56:54 -04:00
19 changed files with 712 additions and 143 deletions

View File

@ -12,7 +12,13 @@ public class Settings
{
[JsonInclude]
[JsonPropertyName("scale")]
[SettingInfo(SettingGroup.AppSettings, SettingsPage.General)]
[SettingInfo(SettingGroup.AppSettings, SettingsPage.Appearance)]
[Shared.GlobalAttributes.DisplayName("Message Font Size")]
[Description("Sets the px value for the message font size")]
[NumberSelector(typeof(double?))]
[NumberMin<double>(0.25)]
[NumberDefault<double>(1)]
[NumberMax<double>(2)]
public double? Scale { get; set; } = null;
[JsonInclude]
[JsonPropertyName("perscrollpixels")]
@ -93,6 +99,13 @@ public class Settings
public uint DefaultFontPX { get; set; } = 20;
[JsonInclude]
[JsonPropertyName("top_time_font_px")]
[SettingInfo(SettingGroup.AppSettings, SettingsPage.Appearance)]
[Shared.GlobalAttributes.DisplayName("Top Time Font Size")]
[Description("Sets the px value for the top time font size")]
[NumberSelector(typeof(uint))]
[NumberMin<uint>(8)]
[NumberDefault<uint>(12)]
[NumberMax<uint>(20)]
public uint TopTimeFontPX { get; set; } = 12;
[JsonInclude]
[JsonPropertyName("role_settings_font_px")]

View File

@ -1,4 +1,4 @@
using Luski.GUI.MainScreen.UI.PublicServers;
using Luski.GUI.MainScreen.UI.Generic;
using Luski.net.Structures.Public;
namespace Luski.GUI.MainScreen.Interfaces;

View File

@ -0,0 +1,285 @@
using GraphicsManager.Enums;
using GraphicsManager.Interfaces;
using GraphicsManager.Objects;
using GraphicsManager.Objects.Core;
using Luski.GUI.MainScreen.UI.LuskiControls;
using Luski.GUI.MainScreen.UI.LuskiControls.ServerForms;
using OpenTK.Mathematics;
using OpenTK.Windowing.GraphicsLibraryFramework;
namespace Luski.GUI.MainScreen.UI;
public class AddServerOverlayForm : UserControl
{
private TextBox tb;
private CreateAccountUI caUI = new();
private DropDown<VersionDropButton> version;
private LoginUI lUI = new()
{
Visible = false
};
private UserControl btn;
private TextBox UsernameTB
{
get
{
if (lUI.Visible) return lUI.Username;
return caUI.Username;
}
}
private TextBox PasswordTB
{
get
{
if (lUI.Visible) return lUI.Password;
return caUI.Password;
}
}
public AddServerOverlayForm()
:base(Globals.ms.TextureManager.GetTextureResource("RoundedRectangle.png"))
{
base.Size = new(350.ScaleInt(), 347.ScaleInt());
base.BackgroundColor = new(32, 32, 32, 255);
Shader = Rectangle.DefaultAlphaShader[Globals.ms.Context];
TextureDisplay = TextureDisplay.Center;
Label t;
Controls.Add(t=new Label(Globals.DefaultFont) { Scale = 1.6f, Text = "Add Server", Color = Globals.DodgerBlue });
t.Location = new((base.Size.X / 2) - (t.Size.X / 2), t.Location.Y, 0);
Label? ll = new Label(Globals.DefaultFont)
{
Text = net.API.DefaultVersion,
Color = Color4.DarkGray,
IgnoreHover = true
};
Vector2i s =new((int)(ll.Size.X * 1.6f),27.ScaleInt());
ll = null;
Rectangle line = new Rectangle()
{
Size = new Vector2i(1.ScaleInt()),
BackgroundColor = Globals.DodgerBlue
};
int ten = 10.ScaleInt();
tb = new("BadTextbox.png")
{
Location = new(ten,50.ScaleInt(), 0),
Size = (base.Size.X - ten - ten - ten - s.X, s.Y),
WatermarkText = "Server Address",
TextLocation = TextLocation.LineCenter,
AllowMultiLine = false
};
tb.LetterPress += () =>
{
Texture good = Globals.ms.TextureManager.GetTextureResource("Textbox.png");
if (tb.Textures[0].handel != good.handel)
{
tb.Textures[0] = good;
if (UsernameTB.Textures[0].handel == good.handel &&
PasswordTB.Textures[0].handel == good.handel &&
(lUI.Visible || caUI.Avatar.Textures.Count > 1) &&
btn!.Textures[0].handel != good.handel &&
tb.Textures[0].handel == good.handel)
{
btn.Textures[0] = good;
}
Globals.ms.TryDraw();
}
return Task.CompletedTask;
};
tb.LetterRemoved += () =>
{
Texture bad = Globals.ms.TextureManager.GetTextureResource("BadTextbox.png");
if (tb.Text.Length == 0 && tb.Textures[0].handel != bad.handel)
{
tb.Textures[0] = bad;
btn!.Textures[0] = bad;
Globals.ms.TryDraw();
}
return Task.CompletedTask;
};
tb.KeyPress += args =>
{
if (args.Key == Keys.Tab && !args.Shift)
{
UsernameTB.Focus();
}
return Task.CompletedTask;
};
Controls.Add(tb);
version = new DropDown<VersionDropButton>(Textures[0], line)
{
DropDownParentOverride = this,
Size = s,
BackgroundColor = new(255,20,20,255),
TextureDisplay = TextureDisplay.HorizontalCenter,
Shader = Shader,
Location = new(tb.Location.X + tb.Size.X + tb.Location.X, tb.Location.Y, 0)
};
foreach (string v in Globals.Luski.SupportedVersions)
{
VersionDropButton option = new VersionDropButton(s, v)
{
LoadDisplay = () =>
{
try
{
Label ll2 = new Label(Globals.DefaultFont)
{
Text = v,
Color = Color4.DarkGray,
IgnoreHover = true,
};
ll2.Location = new((version.Size.X / 2) - (ll2.Size.X / 2),
((version.Size.Y - ll2.Size.Y) / 2)
, 0);
version.Controls.Add(ll2);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
};
version.AddOption(option);
if (v == net.API.DefaultVersion)
{
version.SetSelected(option);
}
}
version.OpenStatusChanged += VersionOnOpenStatusChanged;
version.OptionSelected += VersionOnOptionSelected;
version.DropDownContainer.Textures.Add(Globals.ms.TextureManager.GetTextureResource("RoundedRectangleBottom.png"));
version.DropDownContainer.TextureDisplay = TextureDisplay.Center;
version.DropDownContainer.Shader = Rectangle.DefaultAlphaShader[Globals.ms.Context];
version.DropDownContainer.BackgroundColor = version.BackgroundColor;
version.OpenStatusChanged += b =>
{
BlockDraw = true;
if (b)
{
version.Textures[0] = Globals.ms.TextureManager.GetTextureResource("RoundedRectangleTop.png");
}
else
{
version.Textures[0] = Globals.ms.TextureManager.GetTextureResource("RoundedRectangle.png");
}
BlockDraw = false;
return Task.CompletedTask;
};
btn = new(Globals.ms.TextureManager.GetTextureResource("BadTextbox.png"))
{
Location = new(tb.Location.X, tb.Location.Y + tb.Size.Y + tb.Location.X, 0),
Size = new(tb.Size.X, tb.Size.Y),
TextureDisplay = TextureDisplay.Center
};
Label sub = new(Globals.DefaultFont)
{
Text = "Submit",
IgnoreHover = true
};
sub.Location = new((btn.Size.X / 2) - (sub.Size.X / 2),
((btn.Size.Y - sub.Size.Y) / 2)
, 0);
sub.ForceDistanceUpdate(btn);
btn.Controls.Add(sub);
Controls.Add(btn);
}
private Task VersionOnOpenStatusChanged(bool arg)
{
return Task.CompletedTask;
}
private Task VersionOnOptionSelected(VersionDropButton arg)
{
return Task.CompletedTask;
}
public override void ParentResize()
{
BlockDraw = true;
for (int i = 0; i < Controls.Length; i++)
{
if (!Controls[i].Loaded) continue;
bool top = (Controls[i].Anchor & ObjectAnchor.Top) == ObjectAnchor.Top;
bool left = (Controls[i].Anchor & ObjectAnchor.Left) == ObjectAnchor.Left;
bool right = (Controls[i].Anchor & ObjectAnchor.Right) == ObjectAnchor.Right;
bool bottom = (Controls[i].Anchor & ObjectAnchor.Bottom) == ObjectAnchor.Bottom;
if (!top && !bottom) { Controls[i].Anchor |= ObjectAnchor.Top; top = true; }
if (!left && !right) { Controls[i].Anchor |= ObjectAnchor.Left; left = true; }
int lx, ly, sy, sx;
bool UpdateDistance = false;
if ((Controls[i].Anchor & ObjectAnchor.PreventWidthChange) == ObjectAnchor.PreventWidthChange)
{
UpdateDistance = true;
lx = Controls[i].Location.X + ((Size.X - Controls[i].Distance.X - Controls[i].Size.X - Controls[i].Location.X) / 2);
sx = Controls[i].Size.X;
}
else
{
lx = (left ? Controls[i].Location.X : Size.X - Controls[i].Distance.X - Controls[i].Size.X);
sx = (right ? Size.X - Controls[i].Distance.X - lx : Controls[i].Size.X);
}
if ((Controls[i].Anchor & ObjectAnchor.PreventHeightChange) == ObjectAnchor.PreventHeightChange)
{
UpdateDistance = true;
ly = Controls[i].Location.Y + ((Size.Y - Controls[i].Distance.Y - Controls[i].Size.Y - Controls[i].Location.Y) / 2);
sy = Controls[i].Size.Y;
}
else
{
ly = (top ? Controls[i].Location.Y : Size.Y - Controls[i].Distance.Y - Controls[i].Size.Y);
sy = (bottom ? Size.Y - Controls[i].Distance.Y - ly : Controls[i].Size.Y);
}
bool mooved = false;
Console.WriteLine(Controls[i].Location);
Console.WriteLine(Controls[i].Size);
Console.WriteLine("New X:{0} Y:{1} W:{2} H:{3}", lx, ly, sx, sy);
if (sx != Controls[i].Size.X || sy != Controls[i].Size.Y)
{
mooved = true;
Controls[i].SetSize(sx, sy);
}
if (lx != Controls[i].Location.X || ly != Controls[i].Location.Y)
{
mooved = true;
Controls[i].SetLocation(lx, ly);
}
if (UpdateDistance)
{
Controls[i].ForceDistanceUpdate(this);
}
Console.WriteLine(mooved);
if (Controls[i] is IParent parent)
{
Console.WriteLine(Controls[i]);
parent.ParentResize();
}
}
if (Parent is not null) Parent.TryDraw();
BlockDraw = false;
}
}

View File

@ -13,7 +13,7 @@ using Rectangle = GraphicsManager.Objects.Rectangle;
namespace Luski.GUI.MainScreen.UI;
public class AddServerOverlay : UserControl, IServerOverlay
public class AddServerOverlayld : UserControl, IServerOverlay
{
private UserControl Form, btn;
private DropDown<VersionDropButton> version;
@ -24,7 +24,7 @@ public class AddServerOverlay : UserControl, IServerOverlay
private Rectangle? rec;
public AddServerOverlay()
public AddServerOverlayld()
{
base.Size = Globals.ms.ClientSize;
base.BackgroundColor = new(0, 0, 0, 130);
@ -582,7 +582,7 @@ public class AddServerOverlay : UserControl, IServerOverlay
Globals.ServerList.Servers = l.ToArray();
Globals.ServerList.SaveSettings(Path.Combine(Globals.LuskiPath, "Servers.json"), ServerListContext.Default.ServerList);
ServerIcon<PublicServer> ss = new ServerIcon<PublicServer>(ps);
Globals.ms.ser.Controls.Insert(Globals.ms.ser.Controls.Length - 1, ss);
Globals.ms.ServerFlow.Controls.Insert(Globals.ms.ServerFlow.Controls.Length - 1, ss);
await ss.LoadServer();
Globals.ms.Controls.Remove(this);
Globals.ms.TryDraw();

View File

@ -5,10 +5,9 @@ using GraphicsManager.Objects.Core;
using Luski.GUI.MainScreen.Interfaces;
using Luski.GUI.MainScreen.UI.LuskiControls;
using Luski.net.Structures.Public;
using Luski.Shared.PublicServers.V1.Enums;
using OpenTK.Windowing.Common.Input;
namespace Luski.GUI.MainScreen.UI.PublicServers;
namespace Luski.GUI.MainScreen.UI.Generic;
public class Category : UserControl, IChannelAdder
{

View File

@ -3,14 +3,13 @@ using GraphicsManager.Interfaces;
using GraphicsManager.Objects;
using GraphicsManager.Objects.Core;
using Luski.GUI.MainScreen.UI.LuskiControls;
using Luski.net.Enums;
using Luski.net.Structures.Public;
using Luski.Shared.PublicServers.V1.Enums;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics;
using OpenTK.Windowing.Common.Input;
namespace Luski.GUI.MainScreen.UI.PublicServers;
namespace Luski.GUI.MainScreen.UI.Generic;
public class Channel : UserControl
{
@ -106,19 +105,19 @@ public class Channel : UserControl
CS.Selected = this;
IReadOnlyList<SocketMessage> m;
m = await CurrentChannel.GetMessages(CancellationToken.None, Globals.Settings.LoadPerChannel);
Globals.ms.pc.ClearChat();
await Globals.ms.pc.LoadChannel(CurrentChannel);
mm = Globals.ms.pc.AddMessages(m);
Globals.ms.ChatBoxArea.ClearChat();
await Globals.ms.ChatBoxArea.LoadChannel(CurrentChannel);
mm = Globals.ms.ChatBoxArea.AddMessages(m);
}
if (mm is not null)
{
Console.WriteLine("Waiting");
Task.WaitAll(mm);
Globals.ms.pc.MessageFlow.ForceScrollUpdate();
if (Globals.ms.pc.MessageFlow.Controls.Length > 1 && Globals.ms.pc.MessageFlow.Controls[Globals.ms.pc.MessageFlow.Controls.Length - 1].Location.Y + Globals.ms.pc.MessageFlow.Controls[Globals.ms.pc.MessageFlow.Controls.Length - 1].Size.Y > Globals.ms.pc.MessageFlow.Size.Y)
Globals.ms.pc.MessageFlow.ScrollToBottom();
else Globals.ms.pc.MessageFlow.ScrollToTop();
Globals.ms.ChatBoxArea.MessageFlow.ForceScrollUpdate();
if (Globals.ms.ChatBoxArea.MessageFlow.Controls.Length > 1 && Globals.ms.ChatBoxArea.MessageFlow.Controls[Globals.ms.ChatBoxArea.MessageFlow.Controls.Length - 1].Location.Y + Globals.ms.ChatBoxArea.MessageFlow.Controls[Globals.ms.ChatBoxArea.MessageFlow.Controls.Length - 1].Size.Y > Globals.ms.ChatBoxArea.MessageFlow.Size.Y)
Globals.ms.ChatBoxArea.MessageFlow.ScrollToBottom();
else Globals.ms.ChatBoxArea.MessageFlow.ScrollToTop();
Console.WriteLine("Done");
}
BlockDraw = false;

View File

@ -1,32 +1,25 @@
using System.Runtime.CompilerServices;
using GraphicsManager.Enums;
using GraphicsManager.Interfaces;
using GraphicsManager.Objects;
using Luski.GUI.MainScreen.Interfaces;
using Luski.GUI.MainScreen.UI.PublicServers;
using Luski.net.Structures.Public;
using Luski.Shared.PublicServers.V1.Enums;
using OpenTK.Mathematics;
namespace Luski.GUI.MainScreen.UI.PublicServers;
namespace Luski.GUI.MainScreen.UI.Generic;
public class ChannelSelector : FlowLayout, IChannelAdder
{
public SocketCategory CurrentCategory { get; }
public SocketCategory CurrentCategory { get; private set; }
private readonly List<Category> cc = new();
private readonly List<Channel> LoadedChannels = new();
public Dictionary<long, IChannelAdder> ChannelAdders = new();
public Channel? Selected;
private ChannelSelector(SocketCategory Cat)
public async Task LoadSelectorRoot(SocketCategory Cat)
{
CurrentCategory = Cat;
ChannelAdders.Add(Cat.ID, this);
Cat.Server.MessageReceived += ServerOnMessageReceived;
}
public static async Task<ChannelSelector> MakeSelector(SocketCategory Cat)
{
ChannelSelector cs = new(Cat);
bool MakeChannels = await Cat.Server.User.HasAccessToCategory(Cat, ServerPermission.CreateChannels);
bool MakeRoles = await Cat.Server.User.HasPermissions(ServerPermission.ManageRoles);
if (MakeChannels || MakeRoles)
@ -35,17 +28,15 @@ public class ChannelSelector : FlowLayout, IChannelAdder
if (MakeChannels)
{
Label l = lcm.AddLabel("Create Channel");
l.Clicked += cs.LOnClicked;
l.Clicked += LOnClicked;
}
if (MakeRoles)
{
Label l = lcm.AddLabel("Create Role");
l.Clicked += cs.RLOnClicked;
l.Clicked += RLOnClicked;
}
cs.ContextMenu = lcm;
ContextMenu = lcm;
}
return cs;
}
private async Task RLOnClicked(IRenderObject arg)
@ -63,8 +54,8 @@ public class ChannelSelector : FlowLayout, IChannelAdder
private async Task ServerOnMessageReceived(SocketMessage arg)
{
if (Selected is null || arg.ChannelID != Selected.CurrentChannel.ID) return;
bool u = Globals.ms.pc.MessageFlow.MaxScrollValue == Globals.ms.pc.MessageFlow.ScrollValue;
await Globals.ms.pc.AddMessage(arg, u);
bool u = Globals.ms.ChatBoxArea.MessageFlow.MaxScrollValue == Globals.ms.ChatBoxArea.MessageFlow.ScrollValue;
await Globals.ms.ChatBoxArea.AddMessage(arg, u);
}

View File

@ -0,0 +1,27 @@
using GraphicsManager.Enums;
using GraphicsManager.Interfaces;
using GraphicsManager.Objects;
namespace Luski.GUI.MainScreen.UI.LuskiControls;
public class CenterFullScreenBase : UserControl
{
private IRenderObject centerobj;
public CenterFullScreenBase(IRenderObject obj, bool Streach = false)
{
centerobj = obj;
if (!Streach) obj.Anchor = ObjectAnchor.Prevent;
else obj.Anchor = ObjectAnchor.All;
Controls.Add(obj);
base.BackgroundColor = new(0, 0, 0, 130);
Anchor = ObjectAnchor.All;
}
public override void LoadToParent(IParent p, IWindow w)
{
base.SetSize(w.CS.X, w.CS.Y);
centerobj.SetLocation((w.CS.X - centerobj.Size.X)/2, (w.CS.Y - centerobj.Size.Y)/2);
centerobj.ForceDistanceUpdate(this);
base.LoadToParent(p, w);
}
}

View File

@ -183,7 +183,7 @@ public class NumberSelector<TNumber> : UserControl where TNumber : INumber<TNumb
public override void SetSize(int w, int h)
{
base.SetSize(w, 50.ScaleInt());
progressBar.SetSize(w, 8.ScaleInt());
progressBar.SetSize(w - space - space, 8.ScaleInt());
progressBar.UpdateProgress();
progressBar.ForceDistanceUpdate(this);
Min = Min;

View File

@ -0,0 +1,9 @@
using GraphicsManager.Objects;
namespace Luski.GUI.MainScreen.UI.LuskiControls.ServerForms;
public class CreateAccountUI : UserControl
{
public Rectangle Avatar = new();
public TextBox Username = new(), Password = new(), DisplayName = new();
}

View File

@ -0,0 +1,13 @@
using GraphicsManager.Objects;
namespace Luski.GUI.MainScreen.UI.LuskiControls.ServerForms;
public class LoginUI : UserControl
{
public TextBox Username = new(), Password = new();
public LoginUI()
{
}
}

View File

@ -41,7 +41,13 @@ public class SettingsMenu : UserControl
};
closebtn.MouseLeave += _ =>
{
if (bl) BlockDraw = true;
closebtn.BackgroundColor = Color4.Gray;
if (bl)
{
BlockDraw = false;
bl = false;
}
return Task.CompletedTask;
};
closebtn.Clicked += ClosebtnOnClicked;
@ -49,8 +55,11 @@ public class SettingsMenu : UserControl
Controls.Add(closebtn);
}
private bool bl;
private Task ClosebtnOnClicked(IRenderObject arg)
{
bl = true;
Globals.ms.Controls.Remove(this, false);
Globals.ms.Title = BehindName;
Globals.ms.DrawFrame();

View File

@ -20,8 +20,8 @@ public class TextBox : UserControl
public int CursorLocation { get; set; }
public TextBox()
:base(Globals.ms.TextureManager.GetTextureResource("Textbox.png"))
public TextBox(string defaul = "Textbox.png")
:base(Globals.ms.TextureManager.GetTextureResource(defaul))
{
t = new(500);
t.Elapsed += TOnElapsed;
@ -44,8 +44,10 @@ public class TextBox : UserControl
(int)_label.LineHeight ),
Location = _watermark.Location,
BackgroundColor = Color4.White,
Visible = false
Visible = false,
IgnoreHover = true
};
IgnoreVisForChildren = true;
Controls.Add(Pointer);
Controls.Add(_label);

View File

@ -28,7 +28,6 @@ public class UserView : UserControl
{
name = $"[gradient colors=\"{r.Colors.ToDB()}\"]{name}[/gradient]";
}
Console.WriteLine(name);
LuskiLabel uname = new(Globals.DefaultFont)
{

View File

@ -77,27 +77,18 @@ public class Generic : PageFlow
prop.SetValue(Globals.Settings, b);
Globals.Settings.SaveSettings(Path.Combine(Globals.LuskiPath, "Settings.json"), SettingsContext.Default.Settings);
});
//AddSelector(prop, (uint)PropVal);
}
if (typeinfo.Kind.FullName == typeof(double?).FullName)
{
double? pv = (double?)PropVal;
Globals.AddNullNumberSlider(this, prop, pv, b =>
{
prop.SetValue(Globals.Settings, b);
Globals.Settings.SaveSettings(Path.Combine(Globals.LuskiPath, "Settings.json"), SettingsContext.Default.Settings);
});
}
}
}
}
private void AddSelector<TNumber>(PropertyInfo prop , TNumber val) where TNumber : INumber<TNumber>
{
UserControl space = new();
space.BackgroundColor = Color4.Blue;
NumberSelector<TNumber> selector = new();
selector.BackgroundColor = this.BackgroundColor;
space.SetSize(Size.X, selector.Size.Y + 40.ScaleInt());
selector.SetSize(this.Size.X, 0);
selector.SetLocation(0,40.ScaleInt());
selector.Min = prop.GetAnyAttribute<NumberMin<TNumber>>().Min;
selector.Max = prop.GetAnyAttribute<NumberMax<TNumber>>().Max;
selector.Default = prop.GetAnyAttribute<NumberDefault<TNumber>>().Default;
selector.Value = val;
selector.Anchor = ObjectAnchor.All;
space.Controls.Add(selector);
Controls.Add(space);
}
}

View File

@ -6,6 +6,7 @@ using GraphicsManager.Interfaces;
using GraphicsManager.Objects;
using GraphicsManager.Objects.Core;
using Luski.GUI.MainScreen.UI;
using Luski.GUI.MainScreen.UI.Generic;
using Luski.GUI.MainScreen.UI.LuskiControls;
using Luski.GUI.MainScreen.UI.LuskiSettings;
using Luski.GUI.MainScreen.UI.PublicServers;
@ -36,7 +37,7 @@ public class MainScreenWindow : Window
APIVersion = new Version(3, 2),
API = ContextAPI.OpenGL,
StartFocused = true,
Size = new Vector2i(624, 1090),
ClientSize = new Vector2i(624, 1090),
Icon = Globals.Icon,
SharedContext = null,
};
@ -120,7 +121,6 @@ public class MainScreenWindow : Window
ShowMissingChar = true;
LogFrames = ((Globals.Settings.Logs & ConsoleLog.DrawFrames) == ConsoleLog.DrawFrames);
VSync = VSyncMode.On;
GL.DebugMessageCallback(DebugMessageDelegate, IntPtr.Zero);
GL.Enable(EnableCap.DebugOutput);
GLFW.SetErrorCallback(GLFW_Error);
@ -150,7 +150,6 @@ public class MainScreenWindow : Window
Console.WriteLine(e);
}
Globals.DefaultFont.PixelHeight = Globals.Settings.DefaultFontPX.ScaleFont();
Globals.DefaultFont.FontSize = FontSize.Regular;
Globals.TopTimeFont = Globals.DefaultFont.Clone();
@ -175,10 +174,13 @@ public class MainScreenWindow : Window
CenterWindow();
}
WindowLoaded += OnWindowLoaded;
BlockDraw = true;
}
private async Task OnWindowLoaded(Window arg)
{
BlockDraw = false;
Console.WriteLine("start");
if (Globals.UpdaterSettings.AutoUpdateCheck && new HttpClient()
.GetAsync(
$"https://www.jacobtech.com/Updater/GetProgramVersion?directory=Luski&branch=main&selfcontained={Globals.UpdaterSettings.SelfContained.ToString().ToLower()}&platform={Globals.UpdaterSettings.Platform}")
@ -196,9 +198,10 @@ public class MainScreenWindow : Window
await LoginOnChangeToApp();
}
public FlowLayout ser;
private UserControl? SerBox;
public PublicChat pc;
public FlowLayout ServerFlow;
private UserControl SerBox, ServerTitle;
public PublicChat ChatBoxArea;
public ChannelSelector ChannelSelector;
public async Task LoadPublicServer(PublicServer? Server)
{
@ -211,38 +214,25 @@ public class MainScreenWindow : Window
ServerLoginOverlay SLO = new(Server.Domain);
Controls.Add(SLO);
ForceUpdate();
Globals.PrintParent(this);
return;
}
BlockDraw = true;
try
{
#region Box Init
if (SerBox is null)
{
SerBox = new()
{
Location = new(ser.Size.X, 0, 0),
Size = new(Size.X - ser.Size.X, CS.Y),
Anchor = ObjectAnchor.All,
BackgroundColor = new(20, 20, 20, 255)
};
Controls.Add(SerBox);
SerBox.LoadToParent(this, this);
}
#region Control Removing
ServerTitle.Controls.Clear();
ChannelSelector.Controls.Clear();
SerBox.Controls.Remove(ServerTitle, false);
SerBox.Controls.Remove(ChannelSelector, false);
SerBox.Controls.Clear();
SerBox.Controls.Add(ServerTitle);
SerBox.Controls.Add(ChannelSelector);
#endregion
#region Server Title
UserControl ServerTitle = new()
{
Size = new(307.ScaleInt(), 46.ScaleInt()),
BackgroundColor = new(30, 30, 30, 255)
};
Label title = new(Globals.DefaultFont)
{
Text = Server.Name,
@ -280,35 +270,29 @@ public class MainScreenWindow : Window
}
parents.Reverse();
ChannelSelector cs = await ChannelSelector.MakeSelector(parents[0]);
cs.BackgroundColor = new(34, 34, 34, 255);
cs.Location = new(0, ServerTitle.Size.Y +2.ScaleInt(), 0);
cs.Size = new(ServerTitle.Size.X, SerBox.Size.Y - 54.ScaleInt() - cs.Location.Y);
cs.Anchor = ObjectAnchor.Top | ObjectAnchor.Left | ObjectAnchor.Bottom;
await ChannelSelector.LoadSelectorRoot(parents[0]);
parents.RemoveAt(0);
SerBox.Controls.Add(cs);
cs.ForceDistanceUpdate(SerBox);
#endregion
#region Chat Init
pc = new()
ChatBoxArea = new()
{
Anchor = ObjectAnchor.All,
Location = new(cs.Size.X, 0, 0),
Size = new(SerBox.Size.X - cs.Size.X, SerBox.Size.Y),
Location = new(ChannelSelector.Size.X, 0, 0),
Size = new(SerBox.Size.X - ChannelSelector.Size.X, SerBox.Size.Y),
};
SerBox.Controls.Add(pc);
pc.LoadToParent(SerBox, this);
pc.ForceDistanceUpdate();
pc.MessageFlow.ForceDistanceUpdate(pc);
SerBox.Controls.Add(ChatBoxArea);
ChatBoxArea.LoadToParent(SerBox, this);
ChatBoxArea.ForceDistanceUpdate();
ChatBoxArea.MessageFlow.ForceDistanceUpdate(ChatBoxArea);
#endregion
#region Channel Selector Loader
_ = cs.Load(current_channel, parents);
_ = ChannelSelector.Load(current_channel, parents);
#endregion
@ -316,7 +300,7 @@ public class MainScreenWindow : Window
ServerProfile DefaultProfile = await Server.GetProfile(Server.User.ServerProfile, CancellationToken.None);
IRenderObject u = await DefaultProfile.MakeRct(Server.User, new(46.ScaleInt()));
int ii = 4.ScaleInt();
u.Location = new(ii, cs.Location.Y + cs.Size.Y + ii, 0);
u.Location = new(ii, ChannelSelector.Location.Y + ChannelSelector.Size.Y + ii, 0);
u.Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left;
SerBox.Controls.Add(u);
u.LoadToParent(SerBox, this);
@ -364,11 +348,12 @@ public class MainScreenWindow : Window
SerBox.Controls.Add(ul);
Rectangle setting = new(TextureManager.GetTextureResource("settings.png"))
{
Location = new(cs.Size.X - 40.ScaleInt(), cs.Location.Y + cs.Size.Y + 11.ScaleInt(),0),
Location = new(ChannelSelector.Size.X - 40.ScaleInt(), ChannelSelector.Location.Y + ChannelSelector.Size.Y + 11.ScaleInt(),0),
Size = new(32.ScaleInt()),
Shader = Rectangle.DefaultAlphaShader[Context],
BackgroundColor = Color4.Gray,
Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left
Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left,
BlendOverride = true
};
setting.MouseEnter += _ =>
{
@ -431,7 +416,7 @@ public class MainScreenWindow : Window
ProfileFlow.Size = new((int)arg.SizeAsFloat.X, ProfileFlow.Size.Y + con.Size.Y);
}
ProfileFlow.Location = new(ser.Size.X + 5.ScaleInt(),
ProfileFlow.Location = new(ServerFlow.Size.X + 5.ScaleInt(),
CS.Y - 54.ScaleInt() - ProfileFlow.Size.Y,
0);
Controls.Add(ProfileFlow);
@ -449,10 +434,15 @@ public class MainScreenWindow : Window
}
}
private GlobalSettingsMenu? gsm;
private Task SettingOnClicked(IRenderObject arg)
{
GlobalSettingsMenu sm = new();
Controls.Add(sm);
if (gsm is null)
{
gsm = new GlobalSettingsMenu();
}
Controls.Add(gsm);
Globals.ms.DrawFrame();
return Task.CompletedTask;
}
@ -462,8 +452,8 @@ public class MainScreenWindow : Window
if (SerBox is null)
SerBox = new()
{
Location = new(ser.Size.X, 0, 0),
Size = new(Size.X - ser.Size.X, Size.Y),
Location = new(ServerFlow.Size.X, 0, 0),
Size = new(Size.X - ServerFlow.Size.X, Size.Y),
Anchor = ObjectAnchor.All
};
Controls.Add(SerBox);
@ -471,10 +461,54 @@ public class MainScreenWindow : Window
SerBox.Controls.Clear();
}
protected override void OnKeyDown(KeyboardKeyEventArgs e)
{
base.OnKeyDown(e);
if (e.Key == Keys.F9)
{
Globals.PrintParent(this);
}
else if (e.Key == Keys.F10)
{
CheckParent(this);
}
else if (e.Key == Keys.F12)
{
Console.WriteLine("Update Time: " + UpdateAdverage);
Console.WriteLine("Draw Time: " + DrawAdverage);
Console.WriteLine("Total Time: " + TotalAdverage);
}
}
public override void CheckParent(IParent p, IRenderObject c, int xx, Vector3i di)
{
if (p.IgnoreVisForChildren || p.Controls.Length <= 1 || xx >= p.Controls.Length || !c.Visible || c is ILabel) return;
for (int i = xx; i > 0; i--)
{
if (!p.Controls[i].IsVisible ||
((p.Controls[i].Location.X + di.X >= c.Location.X && p.Controls[i].Location.X + p.Controls[i].Size.X + di.X - c.Size.X <= c.Location.X) &&
(p.Controls[i].Location.Y + di.Y >= c.Location.Y && p.Controls[i].Location.Y + p.Controls[i].Size.Y + di.X - c.Size.Y <= c.Location.Y)))
{
p.Controls[i].NotifiNotVisible();
continue;
}
if (p.Controls[i] is IParent pp) CheckParent(pp, c, pp.Controls.Length-1, di + p.Controls[i].Location);
}
}
public override void CheckParent(IParent p)
{
for (int i = p.Controls.Length - 1; i > 0; i--)
{
CheckParent(p, p.Controls[i], i-1, new());
if (p.Controls[i] is IParent pp) CheckParent(pp);
}
}
private async Task<Task> LoginOnChangeToApp()
{
Controls.Clear();
ForceUpdate();
//ForceUpdate();
BlockDraw = true;
Title = "Luski";
unsafe
@ -493,55 +527,162 @@ public class MainScreenWindow : Window
WindowBorder = WindowBorder.Resizable;
BackgroundColor = new Color4(20, 20, 20, 255);
Controls.Add(ser = new FlowLayout()
Controls.Add(ServerFlow = new FlowLayout()
{
BackgroundColor = new(26, 26, 26, 255),
Size = new(68.ScaleInt(), CS.Y),
Anchor = ObjectAnchor.Top | ObjectAnchor.Left | ObjectAnchor.Bottom,
Location = new(0,0,0)
});
ser.ForceDistanceUpdate(this);
ser.LoadToParent(this,this);
ServerFlow.ForceDistanceUpdate(this);
ServerFlow.LoadToParent(this,this);
DrawFrame();
DateTime utcNow = DateTime.UtcNow;
SerBox = new()
{
Location = new(ServerFlow.Size.X, 0, 0),
Size = new(Size.X - ServerFlow.Size.X, CS.Y),
Anchor = ObjectAnchor.All,
BackgroundColor = new(20, 20, 20, 255)
};
Controls.Add(SerBox);
SerBox.LoadToParent(this, this);
ServerTitle = new()
{
Size = new(307.ScaleInt(), 46.ScaleInt()),
BackgroundColor = new(30, 30, 30, 255)
};
SerBox.Controls.Add(ServerTitle);
ChannelSelector = new()
{
BackgroundColor = new(34, 34, 34, 255),
Location = new(0, ServerTitle.Size.Y +2.ScaleInt(), 0),
Anchor = ObjectAnchor.Top | ObjectAnchor.Left | ObjectAnchor.Bottom
};
ChannelSelector.Size = new(ServerTitle.Size.X, SerBox.Size.Y - 54.ScaleInt() - ChannelSelector.Location.Y);
SerBox.Controls.Add(ChannelSelector);
ChannelSelector.ForceDistanceUpdate(SerBox);
Console.WriteLine("Waiting");
Task.WhenAll(Globals.ServersLoading.ToArray()).Wait();
Console.WriteLine("Done waiting");
foreach (PublicServer pser in Globals.Luski.LoadedServers)
{
ServerIcon<PublicServer> si = new ServerIcon<PublicServer>(pser);
ser.Controls.Add(si);
si.LoadToParent(ser, this);
ServerFlow.Controls.Add(si);
si.LoadToParent(ServerFlow, this);
}
foreach (PublicServer pser in Globals.Luski.FailedServers)
{
Console.WriteLine(pser.Name);
ServerIcon<PublicServer> si = new ServerIcon<PublicServer>(pser, true);
ser.Controls.Add(si);
si.LoadToParent(ser, this);
ServerFlow.Controls.Add(si);
si.LoadToParent(ServerFlow, this);
}
AddServerIcon asi = new();
asi.Clicked += AddButtonClicked;
ser.Controls.Add(asi);
ServerFlow.Controls.Add(asi);
if (ser.Controls.Length > 1) (ser.Controls[0] as ServerIcon<PublicServer>)!.LoadServer().Start();
if (ServerFlow.Controls.Length > 1) (ServerFlow.Controls[0] as ServerIcon<PublicServer>)!.LoadServer().Start();
DrawFrame();
MainShow += OnMainShow;
return Task.CompletedTask;
}
public override void ForceUpdate()
{
DateTime dt = DateTime.Now;
BlockDraw = true;
for (int i = 0; i < Controls.Length; i++)
{
if (!Controls[i].Loaded) continue;
bool top = (Controls[i].Anchor & ObjectAnchor.Top) == ObjectAnchor.Top;
bool left = (Controls[i].Anchor & ObjectAnchor.Left) == ObjectAnchor.Left;
bool right = (Controls[i].Anchor & ObjectAnchor.Right) == ObjectAnchor.Right;
bool bottom = (Controls[i].Anchor & ObjectAnchor.Bottom) == ObjectAnchor.Bottom;
if (!top && !bottom) { Controls[i].Anchor |= ObjectAnchor.Top; top = true; }
if (!left && !right) { Controls[i].Anchor |= ObjectAnchor.Left; left = true; }
int lx, ly, sy, sx;
bool UpdateDistance = false;
if ((Controls[i].Anchor & ObjectAnchor.PreventWidthChange) == ObjectAnchor.PreventWidthChange)
{
UpdateDistance = true;
lx = Controls[i].Location.X + ((CS.X - Controls[i].Distance.X - Controls[i].Size.X - Controls[i].Location.X) / 2);
sx = Controls[i].Size.X;
}
else
{
lx = (left ? Controls[i].Location.X : CS.X - Controls[i].Distance.X - Controls[i].Size.X);
sx = (right ? CS.X - Controls[i].Distance.X - lx : Controls[i].Size.X);
}
if ((Controls[i].Anchor & ObjectAnchor.PreventHeightChange) == ObjectAnchor.PreventHeightChange)
{
UpdateDistance = true;
ly = Controls[i].Location.Y + ((CS.Y - Controls[i].Distance.Y - Controls[i].Size.Y - Controls[i].Location.Y) / 2);
sy = Controls[i].Size.Y;
}
else
{
ly = (top ? Controls[i].Location.Y : CS.Y - Controls[i].Distance.Y - Controls[i].Size.Y);
sy = (bottom ? CS.Y - Controls[i].Distance.Y - ly : Controls[i].Size.Y);
}
Controls[i].SetSize(sx, sy);
Controls[i].SetLocation(lx, ly);
if (UpdateDistance)
{
Controls[i].ForceDistanceUpdate(this);
}
if (Controls[i] is IParent parent)
{
parent.ParentResize();
}
}
if (UpdateAdverage is null) UpdateAdverage = DateTime.Now - dt;
else
{
UpdateAdverage = new((UpdateAdverage.Value.Ticks + (DateTime.Now - dt).Ticks)/2);
}
DateTime dtt = DateTime.Now;
DrawFrame();
if (DrawAdverage is null || TotalAdverage is null)
{
DrawAdverage = DateTime.Now - dtt;
TotalAdverage = DateTime.Now - dt;
}
else
{
DrawAdverage = new((DrawAdverage.Value.Ticks + (DateTime.Now - dtt).Ticks)/2);
TotalAdverage = new((TotalAdverage.Value.Ticks + (DateTime.Now - dt).Ticks)/2);
}
BlockDraw = false;
}
private TimeSpan? UpdateAdverage, DrawAdverage, TotalAdverage;
private Task AddButtonClicked(IRenderObject arg)
{
AddServerOverlay aso = new();
CenterFullScreenBase aso = new(new AddServerOverlayForm())
{
AllowHoverFromBehind = false
};
//AddServerOverlayld aso = new();
aso.Clicked += AsoOnClicked;
Controls.Add(aso);
TryDraw();
OnResize(new(CS));
aso.LoadToParent(this, this);
GL.Scissor(0,0, CS.X, CS.Y);
aso.Draw(0,0,0,0, CS.X, CS.Y);
return Task.CompletedTask;
}
@ -550,7 +691,8 @@ public class MainScreenWindow : Window
{
Globals.ms.Controls.Remove(arg);
Globals.ms.DrawFrame();
AddServerOverlay aso = (arg as AddServerOverlay)!;
CenterFullScreenBase aso = (arg as CenterFullScreenBase)!;
//AddServerOverlayld aso = (arg as AddServerOverlayld)!;
aso.Clicked -= AsoOnClicked;
aso.Clean();
aso = null!;

View File

@ -110,7 +110,7 @@ public static class Globals
for (int i = 0; i < p.Controls.Length; i++)
{
if (p.Controls[i].IgnoreHover) continue;
Console.WriteLine(sp + p.Controls[i] + ": " + p.Controls[i].Location + " " + (p.Controls[i].Location + l) + " "+ p.Controls[i].Size);
Console.WriteLine(sp + p.Controls[i] + ": " + p.Controls[i].IsVisible + " " + p.Controls[i].Location + " " + (p.Controls[i].Location + l) + " "+ p.Controls[i].Size);
if (p.Controls[i] is IParent pp) PrintP(index + 1, pp, l + pp.Position);
}
}
@ -319,7 +319,7 @@ public static class Globals
public static UserControl AddNumberSlider<TNumber>(IParent parent, string Name, string description, TNumber defaul, TNumber min, TNumber val, TNumber max, Action<TNumber> a) where TNumber : INumber<TNumber>
{
NumberSelector<TNumber> ts = new()
NumberSelector<TNumber> NumberSelector = new()
{
Default = defaul,
Min = min,
@ -348,24 +348,105 @@ public static class Globals
Text = description
});
tc.Size = l.Size;
tc.Controls.Add(ts);
ts.Location = new(5.ScaleInt(), l.Location.Y + l.Size.Y + space, 0);
tc.Controls.Add(NumberSelector);
NumberSelector.Location = new(5.ScaleInt(), l.Location.Y + l.Size.Y + space, 0);
Rectangle TempLine = new()
{
Location = new(0, ts.Location.Y + ts.Size.Y + space, 0),
Location = new(0, NumberSelector.Location.Y + NumberSelector.Size.Y + space, 0),
BackgroundColor = Color4.White,
Anchor = ObjectAnchor.Left | ObjectAnchor.Right | ObjectAnchor.Top
};
l.Tag = TempLine;
TempLine.Size = new(parent.Size.X - space - space, 2.ScaleInt());
tc.SetSize(parent.Size.X, TempLine.Location.Y + TempLine.Size.Y);
ts.SetSize(TempLine.Size.X - 10.ScaleInt(), 0);
ts.SetLocation(TempLine.Location.X, ts.Location.Y);
ts.ForceDistanceUpdate(tc);
NumberSelector.SetSize(TempLine.Size.X, 0);
NumberSelector.SetLocation(TempLine.Location.X, NumberSelector.Location.Y);
NumberSelector.ForceDistanceUpdate(tc);
TempLine.ForceDistanceUpdate(tc);
tc.Controls.Add(TempLine);
NumberSelector.ValueChanged += @switch =>
{
a.Invoke(@switch.Value);
return Task.CompletedTask;
};
tc.ForceDistanceUpdate(parent);
parent.Controls.Add(tc);
return tc;
}
public static UserControl AddNullNumberSlider<TNumber>(IParent parent, string Name, string description, TNumber defaul, TNumber min, TNumber? val, TNumber max, Action<TNumber?> a) where TNumber : struct, INumber<TNumber>
{
TNumber v = defaul;
if (val is not null) v = val.Value;
ToggleSwitch ts = new()
{
Value = val is not null,
Anchor = ObjectAnchor.Top | ObjectAnchor.Right
};
NumberSelector<TNumber> NumberSelector = new()
{
Default = defaul,
Min = min,
Max = max,
Value = v,
Anchor = ObjectAnchor.Top | ObjectAnchor.Right | ObjectAnchor.Left,
BackgroundColor = new(0,0,0,0),
Space = 10.ScaleInt()
};
UserControl tc = new()
{
BackgroundColor = new(0,0,0,0)
};
Label l, ll;
int space = 5.ScaleInt();
tc.Controls.Add(ll =new Label(Globals.DefaultFont)
{
Location = new(0, space + space, 0),
Text = Name
});
tc.Controls.Add(l =new Label(Globals.DefaultFont)
{
Location = new(ll.Location.X, ll.Size.Y + space, 0),
Color = Color4.Gray,
MaxSize = parent.Size,
Text = description
});
tc.Size = l.Size;
tc.Controls.Add(ts);
ts.Location = new(parent.Size.X - ts.Size.X - 5.ScaleInt(), ll.Location.Y, 0);
tc.Controls.Add(NumberSelector);
NumberSelector.Location = new(5.ScaleInt(), l.Location.Y + l.Size.Y + space, 0);
Rectangle TempLine = new()
{
Location = new(0, NumberSelector.Location.Y + NumberSelector.Size.Y + space, 0),
BackgroundColor = Color4.White,
Anchor = ObjectAnchor.Left | ObjectAnchor.Right | ObjectAnchor.Top
};
l.Tag = TempLine;
TempLine.Size = new(parent.Size.X - space - space, 2.ScaleInt());
tc.SetSize(parent.Size.X, TempLine.Location.Y + TempLine.Size.Y);
NumberSelector.SetSize(TempLine.Size.X, 0);
NumberSelector.SetLocation(TempLine.Location.X, NumberSelector.Location.Y);
NumberSelector.ForceDistanceUpdate(tc);
TempLine.ForceDistanceUpdate(tc);
tc.Controls.Add(TempLine);
ts.ForceDistanceUpdate(tc);
ts.ValueChanged += @switch =>
{
if (@switch.Value)
{
a.Invoke(defaul);
}
else
{
NumberSelector.Value = defaul;
a.Invoke(null);
}
return Task.CompletedTask;
};
NumberSelector.ValueChanged += @switch =>
{
a.Invoke(@switch.Value);
return Task.CompletedTask;
@ -412,7 +493,20 @@ public static class Globals
t.GetCustomAttributes(typeof(Luski.Shared.GlobalAttributes.DisplayNameAttribute), false);
if (namevalueAttributes.Length == 0) return;
string Name = ((Luski.Shared.GlobalAttributes.DisplayNameAttribute)namevalueAttributes[0]).DisplayName;
AddNumberSlider(parent, Name, description, t.GetAnyAttribute<NumberDefault<TNumber>>().Default, t.GetAnyAttribute<NumberMin<TNumber>>().Min, s, t.GetAnyAttribute<NumberMax<TNumber>>().Max,a);
_ = AddNumberSlider(parent, Name, description, t.GetAnyAttribute<NumberDefault<TNumber>>().Default, t.GetAnyAttribute<NumberMin<TNumber>>().Min, s, t.GetAnyAttribute<NumberMax<TNumber>>().Max,a);
}
public static void AddNullNumberSlider<TNumber>(IParent parent, PropertyInfo t, TNumber? s, Action<TNumber?> a) where TNumber : struct, INumber<TNumber>
{
object[] valueAttributes =
t.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (valueAttributes.Length == 0) return;
string description = ((DescriptionAttribute)valueAttributes[0]).Description;
object[] namevalueAttributes =
t.GetCustomAttributes(typeof(Luski.Shared.GlobalAttributes.DisplayNameAttribute), false);
if (namevalueAttributes.Length == 0) return;
string Name = ((Luski.Shared.GlobalAttributes.DisplayNameAttribute)namevalueAttributes[0]).DisplayName;
_ = AddNullNumberSlider(parent, Name, description, t.GetAnyAttribute<NumberDefault<TNumber>>().Default, t.GetAnyAttribute<NumberMin<TNumber>>().Min, s, t.GetAnyAttribute<NumberMax<TNumber>>().Max,a);
}
public static TAttribute GetAnyAttribute<TAttribute>(this PropertyInfo t)

View File

@ -22,8 +22,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GraphicsManager" Version="1.1.0-alpha68" />
<PackageReference Include="Luski.net" Version="2.0.1-alpha17" />
<PackageReference Include="GraphicsManager" Version="1.1.0-alpha98" />
<PackageReference Include="Luski.net" Version="2.0.1-alpha18" />
</ItemGroup>
<ItemGroup>

View File

@ -1,12 +1,7 @@
using System.Diagnostics;
using GraphicsManager;
using GraphicsManager.Enums;
using GraphicsManager.Objects.Core;
using Luski;
using Luski.Classes;
using Luski.GUI;
using Luski.GUI.MainScreen.UI.LuskiControls;
using OpenTK.Mathematics;
using OpenTK.Windowing.Common.Input;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
@ -55,6 +50,7 @@ try
switch (server.Main)
{
case false:
// if (server.Domain == "jt.luskiserver.jacobtech.com") continue;
Globals.ServersLoading.Add(Task.Run(async () =>
{
return await Globals.Luski.TryGetPublicServer(out _, server.Domain, server.Version,
@ -81,7 +77,7 @@ try
MainScreenWindow.Settings.Icon = Globals.Icon;
Globals.ms = new MainScreenWindow();
Globals.ms.CustomF11 = false;
Globals.ms.DrawFrame();
//Globals.ms.DrawFrame();
pixels = Array.Empty<byte>();
Globals.ms.StartRender();
Globals.ms.Dispose();