From 532d21249424cd2481a192569f49f2d8cc38d237 Mon Sep 17 00:00:00 2001 From: JacobTech Date: Sat, 13 Apr 2024 13:11:26 -0400 Subject: [PATCH] Server Profiles I added a way to switch profiles that are assigned to you on a server. --- .../UI/LuskiControls/ProfileView.cs | 39 ++++++++++ .../UI/PublicServers/ChatMessage.cs | 2 - .../MainScreen/UI/PublicServers/PublicChat.cs | 11 ++- Luski/GUI/MainScreenWindow.cs | 71 ++++++++++++++++++ Luski/Globals.cs | 2 + Luski/Luski.csproj | 2 +- Luski/Resources/Textures/Expand.png | Bin 0 -> 218 bytes 7 files changed, 118 insertions(+), 9 deletions(-) create mode 100644 Luski/GUI/MainScreen/UI/LuskiControls/ProfileView.cs create mode 100644 Luski/Resources/Textures/Expand.png diff --git a/Luski/GUI/MainScreen/UI/LuskiControls/ProfileView.cs b/Luski/GUI/MainScreen/UI/LuskiControls/ProfileView.cs new file mode 100644 index 0000000..4911f43 --- /dev/null +++ b/Luski/GUI/MainScreen/UI/LuskiControls/ProfileView.cs @@ -0,0 +1,39 @@ +using GraphicsManager.Interfaces; +using GraphicsManager.Objects; +using Luski.net.Structures.Public; +using OpenTK.Mathematics; + +namespace Luski.GUI.MainScreen.UI.LuskiControls; + +public class ProfileView : UserControl +{ + public SocketUser User { get; set; } + + private ProfileView(IRenderObject user, SocketUser u, ServerProfile p, Role r, Color? c = null) + { + this.User = u; + base.Size = new(244.ScaleInt(), 44.ScaleInt()); + base.BackgroundColor = new(34, 34, 34, 255); + user.Location = new(8.ScaleInt(), 6.ScaleInt(), 0); + user.ForceDistanceUpdate(this); + user.IgnoreHover = true; + Color4 col = r.Color.ToColor4(); + if (c is not null) col = c.ToColor4(); + Label uname = new(Globals.DefaultFont) + { + Text = p.DisplayName, + Color = col, + IgnoreHover = true + }; + uname.Location = new(user.Location.X + user.Size.X + 8.ScaleInt(), + (user.Location.Y + (user.Size.Y / 2) - (uname.Size.Y / 2)), 0); + Controls.Add(uname); + Controls.Add(user); + } + + public static async Task Make(SocketUser u, ServerProfile p, Role r) + { + ProfileView m = new(await p.MakeRct(u, new(32.ScaleInt())), u, p, r); + return m; + } +} \ No newline at end of file diff --git a/Luski/GUI/MainScreen/UI/PublicServers/ChatMessage.cs b/Luski/GUI/MainScreen/UI/PublicServers/ChatMessage.cs index 2b8be1b..89e2cb7 100644 --- a/Luski/GUI/MainScreen/UI/PublicServers/ChatMessage.cs +++ b/Luski/GUI/MainScreen/UI/PublicServers/ChatMessage.cs @@ -1,9 +1,7 @@ using System.Diagnostics; -using System.Runtime.CompilerServices; using GraphicsManager.Enums; using GraphicsManager.Interfaces; using GraphicsManager.Objects; -using Luski.net.Interfaces; using Luski.net.Structures.Main; using Luski.net.Structures.Public; using OpenTK.Mathematics; diff --git a/Luski/GUI/MainScreen/UI/PublicServers/PublicChat.cs b/Luski/GUI/MainScreen/UI/PublicServers/PublicChat.cs index 86976ad..d8ba652 100644 --- a/Luski/GUI/MainScreen/UI/PublicServers/PublicChat.cs +++ b/Luski/GUI/MainScreen/UI/PublicServers/PublicChat.cs @@ -174,7 +174,7 @@ public class PublicChat : UserControl if (arg.Key == Keys.Enter && !arg.Shift) { - await Channel!.SendMessage(tb.Text); + await Channel!.SendMessage(tb.Text, FakeProfile: Globals.ServerProfile); tb.Text = string.Empty; tb.CursorLocation = 0; } @@ -446,10 +446,9 @@ public class PublicChat : UserControl bool hasbeentenmin = false; if (lastm is not null) { - DateTime chan = Channel!.Epoch.AddMilliseconds(lastm.ID >> 22).ToLocalTime(); hasbeentenmin = - Channel!.Epoch.AddMilliseconds(lastm.ID >> 22).ToLocalTime().AddMinutes(10) < - Channel!.Epoch.AddMilliseconds(Message.ID >> 22).ToLocalTime(); + Channel!.Epoch.AddMilliseconds(lastm.TimeStamp).ToLocalTime().AddMinutes(10) < + Channel!.Epoch.AddMilliseconds(Message.TimeStamp).ToLocalTime(); } lastm = Message; @@ -498,8 +497,8 @@ public class PublicChat : UserControl bool hasbeentenmin = false; if (lastmIndex is not null) hasbeentenmin = - Channel!.Epoch.AddMilliseconds(lastmIndex.ID >> 22).ToLocalTime().AddMinutes(10) < - Channel!.Epoch.AddMilliseconds(Message.ID >> 22).ToLocalTime(); + Channel!.Epoch.AddMilliseconds(lastmIndex.TimeStamp).ToLocalTime().AddMinutes(10) < + Channel!.Epoch.AddMilliseconds(Message.TimeStamp).ToLocalTime(); lastmIndex = Message; if (lastUserIndex is null || lastUserIndex != Message.ProfileID || hasbeentenmin) { diff --git a/Luski/GUI/MainScreenWindow.cs b/Luski/GUI/MainScreenWindow.cs index 71c7c44..0bd90e6 100644 --- a/Luski/GUI/MainScreenWindow.cs +++ b/Luski/GUI/MainScreenWindow.cs @@ -7,6 +7,7 @@ using GraphicsManager.Interfaces; using GraphicsManager.Objects; using GraphicsManager.Objects.Core; using Luski.GUI.MainScreen.UI; +using Luski.GUI.MainScreen.UI.LuskiControls; using Luski.GUI.MainScreen.UI.PublicServers; using Luski.net; using Luski.net.Structures.Public; @@ -276,6 +277,29 @@ public class MainScreenWindow : Window ul.Location = new(u.Location.X + u.Size.X + 5.ScaleInt(), (u.Location.Y + ((u.Size.Y - ul.Size.Y) / 2)), 0); + Rectangle Expand = new(TextureManager.GetTextureResource("Expand.png")) + { + Size = new(20.ScaleInt()), + Shader = Rectangle.DefaultAlphaShader[Context], + BackgroundColor = Color4.Gray, + Tag = new Tuple(Server.User, u, ul), + Anchor = u.Anchor + }; + Expand.Clicked += ExpandOnClicked; + Expand.MouseEnter += _ => + { + Expand.BackgroundColor = Color4.White; + return Task.CompletedTask; + }; + Expand.MouseLeave += _ => + { + Expand.BackgroundColor = Color4.Gray; + return Task.CompletedTask; + }; + Expand.Location = new(ul.Location.X + ul.Size.X + 5.ScaleInt(), + u.Location.Y + ((u.Size.Y - Expand.Size.Y) / 2), 0); + Expand.ForceDistanceUpdate(SerBox); + SerBox.Controls.Add(Expand); SerBox.Controls.Add(ul); Rectangle setting = new(TextureManager.GetTextureResource("settings.png")) { @@ -310,6 +334,53 @@ public class MainScreenWindow : Window BlockDraw = false; } + private FlowLayout? ProfileFlow = null; + + private async Task ExpandOnClicked(IRenderObject arg) + { + if (ProfileFlow is null) + { + ProfileFlow = new(); + Tuple s = (Tuple)arg.Tag!; + var role = (await s.Item1.GetRoles())[0]; + foreach (var prof in await s.Item1.GetProfiles(CancellationToken.None)) + { + ProfileView con = await ProfileView.Make(s.Item1, prof, role); + con.Clicked += async o => + { + IRenderObject iro = await prof.MakeRct(s.Item1, s.Item2.Size); + iro.Location = s.Item2.Location; + iro.Distance = s.Item2.Distance; + iro.Anchor = s.Item2.Anchor; + int oldx = s.Item3.Size.X; + s.Item2.Parent!.Controls.Add(iro); + s.Item2.Parent!.Controls.Remove(s.Item2); + s.Item3.Text = prof.DisplayName; + Controls.Remove(ProfileFlow); + ProfileFlow = null; + arg.Location = new(arg.Location.X - oldx + s.Item3.Size.X, arg.Location.Y, arg.Location.Z); + arg.ForceDistanceUpdate(arg.Parent!); + Globals.ServerProfile = prof; + arg.Tag = new Tuple(s.Item1, iro, s.Item3); + TryDraw(); + }; + ProfileFlow.Controls.Add(con); + ProfileFlow.Size = new((int)arg.SizeAsFloat.X, ProfileFlow.Size.Y + con.Size.Y); + } + + ProfileFlow.Location = new(ser.Size.X + 5.ScaleInt(), + CS.Y - 54.ScaleInt() - ProfileFlow.Size.Y, + 0); + Controls.Add(ProfileFlow); + } + else + { + Controls.Remove(ProfileFlow); + ProfileFlow = null; + } + DrawFrame(); + } + private Task SettingOnClicked(IRenderObject arg) { SettingsMenu sm = new(); diff --git a/Luski/Globals.cs b/Luski/Globals.cs index 58d16be..97cb998 100644 --- a/Luski/Globals.cs +++ b/Luski/Globals.cs @@ -266,6 +266,8 @@ public static class Globals public static Dictionary UserTextureMap = new(); public static Dictionary ProfileTextureMap = new(); + public static ServerProfile? ServerProfile = null; + public static async Task MakeRct(this ServerProfile Profile, TUser User, Vector2i Size) where TUser : SocketUser { Texture t = ms.TextureManager.GetTextureResource("Status.png"); diff --git a/Luski/Luski.csproj b/Luski/Luski.csproj index 2b332ac..d8aa17f 100644 --- a/Luski/Luski.csproj +++ b/Luski/Luski.csproj @@ -22,7 +22,7 @@ - + diff --git a/Luski/Resources/Textures/Expand.png b/Luski/Resources/Textures/Expand.png new file mode 100644 index 0000000000000000000000000000000000000000..0b64de560813b212d180b179940eeb5f7def9cbc GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F5M?jcysy3fAP_W0- z#WAE}&fCieIS(lCuwIb4<9+8yV2Mznu=_>ND5a1kF0-daRh?kxZ~E8X#l>J2A;H?M z+`u5utjKc0vibYJT87hWx8|O6jc|zXQ!hBTaiaGEee+`t*LI!Tc|ycu`tm8S4irpO zbeJk{$z^#$;K1%>r!<#LDf-V6A&{JN;j-yv^BK8M*8RNhFXq5tWG&1d7?