diff --git a/Luski/GUI/MainScreen.cs b/Luski/GUI/MainScreen.cs index b8228f1..5fcb92b 100644 --- a/Luski/GUI/MainScreen.cs +++ b/Luski/GUI/MainScreen.cs @@ -1,6 +1,3 @@ -using System.ComponentModel; -using System.Reflection; -using GraphicsManager; using GraphicsManager.Enums; using GraphicsManager.Interfaces; using GraphicsManager.Objects; @@ -31,9 +28,9 @@ public class MainScreen : Window }; private TabControl tc; - private FlowLayout? channelpicker, friends; + private FlowLayout? channelpicker, friends, friend_request; private RoundedButton? FriendManagerBtn; - private Chat? chat; + public Chat? chat; public MainScreen() : base(Settings) { @@ -54,6 +51,21 @@ public class MainScreen : Window private readonly List fr = new(); private List chans = new(); + private Dictionary FR_Index = new(); + + public void AddFriendRequest(SocketRemoteUser user) + { + FriendRequest frui = new(this, user); + FR_Index.Add(user.Id, friend_request!.Controls.Length); + friend_request.Controls.Add(frui); + } + + public void RemoveFriendRequest(SocketRemoteUser user) + { + if (!FR_Index.ContainsKey(user.Id)) return; + friend_request!.Controls.Remove(friend_request!.Controls[FR_Index[user.Id]]); + } + public void AddFriend(SocketRemoteUser user) { Friend friend2 = new(user); @@ -71,17 +83,25 @@ public class MainScreen : Window private Task ChannelOnClickCon(IChannelPick arg) { - if (!chat.Visible) + try { - chat.Visible = true; - tc.Visible = false; + if (!chat.Visible) + { + chat.Visible = true; + tc.Visible = false; + } + chat!.UpdateTitle(arg); + chat.Clear(); + IReadOnlyList messages = arg.Channel.GetMessages(200).Result; + foreach (SocketMessage message in messages.Reverse()) + { + chat.AddMessage(message); + } + DrawFrame(); } - chat!.UpdateTitle(arg); - chat.Clear(); - IReadOnlyList messages = arg.Channel.GetMessages(200).Result; - foreach (SocketMessage message in messages.Reverse()) + catch (Exception e) { - chat.AddMessage(message); + Console.WriteLine(e); } return Task.CompletedTask; } @@ -89,6 +109,7 @@ public class MainScreen : Window private Task LoginOnChangeToApp() { Controls.Clear(); + BlockDraw = true; Title = "Luski"; Size = new(2048, 1334); WindowBorder = WindowBorder.Resizable; @@ -112,16 +133,15 @@ public class MainScreen : Window Anchor = ObjectAnchor.All, Visible = false }); - UserControl f; - tc.AddPage("Frineds", f= new UserControl()); - tc.AddPage("Friend Request", new UserControl()); - tc.AddPage("Add Friend", new UserControl()); - f.Controls.Add(friends = new FlowLayout() + tc.AddPage("Frineds", friends = new FlowLayout() { - Size = f.Size, - BackgroundColor = new(45,45,45,255), - Anchor = ObjectAnchor.All + BackgroundColor = new(45,45,45,255) }); + tc.AddPage("Friend Request", friend_request = new FlowLayout() + { + BackgroundColor = new(45,45,45,255) + }); + tc.AddPage("Add Friend", new AddFriendPage(this)); ser.Controls.Add(new Rectangle(Globals.LuskiTexture) { Size = new(80,80), @@ -152,11 +172,45 @@ public class MainScreen : Window { chat.AddMessage(message); } + Globals.Luski.OnError += LuskiOnOnError; Globals.Luski.UserStatusUpdate += LuskiOnUserStatusUpdate; + Globals.Luski.ReceivedFriendRequest += LuskiOnReceivedFriendRequest; + Globals.Luski.FriendRequestResult += LuskiOnFriendRequestResult; + foreach (SocketRemoteUser cufr in Globals.Luski.CurrentUser.FriendRequests) + { + AddFriendRequest(cufr); + } + + BlockDraw = false; DrawFrame(); return Task.CompletedTask; } + private Task LuskiOnOnError(Exception arg) + { + Console.WriteLine(arg); + return Task.CompletedTask; + } + + private Task LuskiOnFriendRequestResult(SocketRemoteUser arg1, bool arg2) + { + Invoke(new Action(() => + { + RemoveFriendRequest(arg1); + if (arg2) AddFriend(arg1); + })); + return Task.CompletedTask; + } + + private Task LuskiOnReceivedFriendRequest(SocketRemoteUser arg) + { + Invoke(new Action(() => + { + AddFriendRequest(arg); + })); + return Task.CompletedTask; + } + private Task LuskiOnUserStatusUpdate(IUser before, IUser After) { if (before is not SocketRemoteUser Before || Before.FriendStatus != FriendStatus.Friends) return Task.CompletedTask; diff --git a/Luski/GUI/MainScreen/UI/AddFriendPage.cs b/Luski/GUI/MainScreen/UI/AddFriendPage.cs new file mode 100644 index 0000000..4faf17b --- /dev/null +++ b/Luski/GUI/MainScreen/UI/AddFriendPage.cs @@ -0,0 +1,45 @@ +using GraphicsManager.Enums; +using GraphicsManager.Objects; +using Luski.net.JsonTypes; +using OpenTK.Mathematics; +using OpenTK.Windowing.Common; +using OpenTK.Windowing.GraphicsLibraryFramework; + +namespace Luski.GUI.MainScreen.UI; + +public class AddFriendPage : FlowLayout +{ + private MainScreen Screen; + private Textbox Input; + + public AddFriendPage(MainScreen Parent) + { + this.Screen = Parent; + Size = new(400, 96); + BackgroundColor = new(45,45,45,255); + Controls.Add(Input = new Textbox() { Anchor = ObjectAnchor.Left | ObjectAnchor.Top | ObjectAnchor.Right, Location = new(15,15), Size = new(370,40), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); + Input.KeyPress += InputOnKeyPress; + } + + private Task InputOnKeyPress(KeyboardKeyEventArgs arg) + { + + if (Input.BorderColor == Color4.Red) Input.BorderColor = Color4.DarkCyan; + if (arg.Key != Keys.Enter && arg.Key != Keys.KeyPadEnter) return Task.CompletedTask; + if (!long.TryParse(Input.Text, out long code)) + { + Input.BorderColor = Color4.Red; + return Task.CompletedTask; + } + SocketRemoteUser? result = Globals.Luski.SendFriendRequest(code).Result; + if (result is null) Input.BorderColor = Color4.Red; + else + { + if (result.Channel is null) + Screen.AddFriendRequest(result); + else + Screen.AddFriend(result); + } + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Luski/GUI/MainScreen/UI/Chat.cs b/Luski/GUI/MainScreen/UI/Chat.cs index 81953a5..9c44d6b 100644 --- a/Luski/GUI/MainScreen/UI/Chat.cs +++ b/Luski/GUI/MainScreen/UI/Chat.cs @@ -55,11 +55,12 @@ public class Chat : UserControl private void Thr() { Globals.Luski.SendMessage(tb.Text, id); - tb.Text = string.Empty; + Window!.Invoke(new Action(() => { tb.Text = string.Empty; })); } private Task LuskiOnMessageReceived(SocketMessage arg) { + Console.WriteLine(arg); if (id != arg.ChannelID) return Task.CompletedTask; AddMessage(arg); return Task.CompletedTask; diff --git a/Luski/GUI/MainScreen/UI/FriendRequest.cs b/Luski/GUI/MainScreen/UI/FriendRequest.cs new file mode 100644 index 0000000..af91f73 --- /dev/null +++ b/Luski/GUI/MainScreen/UI/FriendRequest.cs @@ -0,0 +1,56 @@ +using GraphicsManager.Enums; +using GraphicsManager.Interfaces; +using GraphicsManager.Objects; +using GraphicsManager.Objects.Core; +using Luski.net.Enums; +using Luski.net.JsonTypes; +using OpenTK.Mathematics; + +namespace Luski.GUI.MainScreen.UI; + +public class FriendRequest : UserControl +{ + private MainScreen Screen; + public SocketRemoteUser User; + public Rectangle Accept, Reject; + + public FriendRequest(MainScreen Parent, SocketRemoteUser User) + { + this.User = User; + this.Screen = Parent; + Size = new(400, 96); + BackgroundColor = new(34, 34, 34, 255); + Controls.Add(new Rectangle(new Texture(User.GetAvatar().Result)) { Location = new(15,17), Size = new(58,58)}); + Controls.Add(new Label() { Text = User.Username, Location = new(77,20)}); + Controls.Add(new Label() { Text = User.FriendStatus.ToString(), Location = new(77,48)}); + if (User.FriendStatus == FriendStatus.PendingIn) + { + Controls.Add(Accept = new Rectangle() + { + Anchor = ObjectAnchor.Top | ObjectAnchor.Right, BackgroundColor = Color4.Green, Location = new(254, 17), + Size = new(58, 58) + }); + Controls.Add(Reject = new Rectangle() + { + Anchor = ObjectAnchor.Top | ObjectAnchor.Right, BackgroundColor = Color4.Red, Location = new(327, 17), + Size = new(58, 58) + }); + Accept.Clicked += AcceptOnClicked; + Reject.Clicked += RejectOnClicked; + } + } + + private Task RejectOnClicked(IRenderObject arg) + { + _ = Globals.Luski.SendFriendResult(User.Id, false).Result; + Screen.RemoveFriendRequest(User); + return Task.CompletedTask; + } + + private Task AcceptOnClicked(IRenderObject arg) + { + Screen.AddFriend(Globals.Luski.SendFriendResult(User.Id, true).Result); + Screen.RemoveFriendRequest(User); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Luski/GUI/StartPage/UI/Login.cs b/Luski/GUI/StartPage/UI/Login.cs index 8ca26d1..79c1f84 100644 --- a/Luski/GUI/StartPage/UI/Login.cs +++ b/Luski/GUI/StartPage/UI/Login.cs @@ -22,15 +22,23 @@ public class Login : UserControl Controls.Add(new Rectangle(Globals.LuskiTexture) { Location = new(103,8), Size = new(276, 289)}); Controls.Add(new Label() { Location = new(173,305), Text = "Luski", Color = new(243, 119, 53, 255) }); Controls.Add(new Label() { Location = new(41,395), Text = "Email"}); - Controls.Add(Email =new Textbox() { Location = new(41,431), Size = new(401,41), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); + Controls.Add(Email = new Textbox() { Location = new(41,431), Size = new(401,41), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); Controls.Add(new Label() { Location = new(41,521), Text = "Password" }); Controls.Add(Password = new Textbox() { PasswordChar = '●', Location = new(41,562), Size = new(401, 41), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); Controls.Add(new Label() { Location = new(41,664), Text = "Create Account" }); Controls.Add(button = new() { Text = "Login", Location = new(41, 700), Size = new(401, 71), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); Password.KeyPress += PasswordOnKeyPress; + Email.KeyPress += EmailOnKeyPress; button.Clicked += ButtonOnClicked; } + private Task EmailOnKeyPress(KeyboardKeyEventArgs arg) + { + if (arg.Key != Keys.Tab) return Task.CompletedTask; + Password.Focus(); + return Task.CompletedTask; + } + private Task PasswordOnKeyPress(KeyboardKeyEventArgs arg) { if (arg.Key != Keys.Enter && arg.Key != Keys.KeyPadEnter) return Task.CompletedTask; diff --git a/Luski/Luski.csproj b/Luski/Luski.csproj index 1682987..77a2e2e 100644 --- a/Luski/Luski.csproj +++ b/Luski/Luski.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/Luski/Program.cs b/Luski/Program.cs index 9cc6ef8..adc49ce 100644 --- a/Luski/Program.cs +++ b/Luski/Program.cs @@ -1,5 +1,12 @@ using Luski.GUI.MainScreen; -MainScreen t = new MainScreen(); -t.StartRender(); -t.Dispose(); \ No newline at end of file +try +{ + MainScreen t = new MainScreen(); + t.StartRender(); + t.Dispose(); +} +catch (Exception ex) +{ + Console.WriteLine(ex); +} \ No newline at end of file