From 5cec5c4230c7add26195ebfc45bbd561f0dc2127 Mon Sep 17 00:00:00 2001 From: JacobTech Date: Sat, 13 Apr 2024 00:36:33 -0400 Subject: [PATCH 1/4] User Profiles The app now uses a server profile to load avatars and names. --- .../MainScreen/UI/LuskiControls/RoleView.cs | 6 ++- .../MainScreen/UI/LuskiControls/UserView.cs | 8 ++-- .../UI/PublicServers/ChatMessage.cs | 11 +++-- .../MainScreen/UI/PublicServers/PublicChat.cs | 12 ++--- Luski/GUI/MainScreenWindow.cs | 5 +- Luski/Globals.cs | 48 +++++-------------- Luski/Luski.csproj | 2 +- 7 files changed, 34 insertions(+), 58 deletions(-) diff --git a/Luski/GUI/MainScreen/UI/LuskiControls/RoleView.cs b/Luski/GUI/MainScreen/UI/LuskiControls/RoleView.cs index e5505f0..356f63c 100644 --- a/Luski/GUI/MainScreen/UI/LuskiControls/RoleView.cs +++ b/Luski/GUI/MainScreen/UI/LuskiControls/RoleView.cs @@ -28,12 +28,14 @@ public class RoleView : FlowLayout public async Task AddUser(SocketUser user, Role TopRole) { - UserView f = await UserView.Make(user, TopRole, r is null); + ServerProfile DefaultProfile = await user.Server.GetProfile(user.ServerProfile, CancellationToken.None); + UserView f = await UserView.Make(user, DefaultProfile, TopRole, r is null); + uuu.Add(user.Id, f); bool ff = false; for (int j = 0; j < Users.Count; j++) { - if (string.Compare(Users[j].DisplayName, user.DisplayName) > 0) + if (string.Compare(DefaultProfile.DisplayName, DefaultProfile.DisplayName) > 0) { Users.Insert(j, user); Controls.Insert(j+1, f); diff --git a/Luski/GUI/MainScreen/UI/LuskiControls/UserView.cs b/Luski/GUI/MainScreen/UI/LuskiControls/UserView.cs index d5f7795..743dbcf 100644 --- a/Luski/GUI/MainScreen/UI/LuskiControls/UserView.cs +++ b/Luski/GUI/MainScreen/UI/LuskiControls/UserView.cs @@ -9,7 +9,7 @@ public class UserView : UserControl { public SocketUser User { get; set; } - private UserView(IRenderObject user, SocketUser u, Role r, bool offline) + private UserView(IRenderObject user, SocketUser u, ServerProfile p, Role r, bool offline) { this.User = u; base.Size = new(244.ScaleInt(), 44.ScaleInt()); @@ -18,7 +18,7 @@ public class UserView : UserControl user.ForceDistanceUpdate(this); Label uname = new(Globals.DefaultFont) { - Text = u.DisplayName, + Text = p.DisplayName, Color = r.Color.ToColor4() }; if (offline) uname.Color = new(uname.Color.R, uname.Color.G, uname.Color.B, uname.Color.A * 0.6f); @@ -28,9 +28,9 @@ public class UserView : UserControl Controls.Add(user); } - public static async Task Make(SocketUser u, Role r, bool offline) + public static async Task Make(SocketUser u, ServerProfile p, Role r, bool offline) { - UserView m = new(await u.MakeRct(new(32.ScaleInt()), true), u, r, offline); + UserView m = new(await p.MakeRct(u, new(32.ScaleInt())), u, p, r, offline); 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 dff0c4d..2b8be1b 100644 --- a/Luski/GUI/MainScreen/UI/PublicServers/ChatMessage.cs +++ b/Luski/GUI/MainScreen/UI/PublicServers/ChatMessage.cs @@ -31,14 +31,16 @@ public class ChatMessage : UserControl public static async Task MakeChatMessage(PublicChat p, SocketMessage message) { - IUser auth = await message.GetAuthor(CancellationToken.None); - Color c = await auth.GetColor(); + SocketUser auth = (SocketUser)(await message.GetAuthor(CancellationToken.None)); + ServerProfile prof = await message.GetProfile(CancellationToken.None); + Color? c = await prof.GetColor(); + if (c is null) c = await auth.GetColor(); Color4 c4 = new(c.R, c.G, c.B, c.A); - return new ChatMessage(p, message, await message.GetParent(CancellationToken.None), auth, await auth.MakeRct(new(40.ScaleInt()), message.IsProfile), c4); + return new ChatMessage(p, message, await message.GetParent(CancellationToken.None), prof, await prof.MakeRct(auth, new(40.ScaleInt())), c4); } - private ChatMessage(PublicChat p, SocketMessage message, SocketChannel chan, IUser Author, IRenderObject UserIcon, Color4 UserNameColor) + private ChatMessage(PublicChat p, SocketMessage message, SocketChannel chan, ServerProfile Author, IRenderObject UserIcon, Color4 UserNameColor) { pc = p; Label label1; @@ -87,7 +89,6 @@ public class ChatMessage : UserControl Controls.Add(label1 = new Label(Globals.DefaultFont) { Color = UserNameColor, Text = Author.DisplayName }); label1.Location = new( 54.ScaleInt(), - //(int)(UserIcon.Location.Y + (UserIcon.Size.Y / 2) - (label1.Font.CurrentFonts[0].Face.Size.Metrics.NominalHeight / 2) - label1.Size.Y + label1.Font.PixelHeight), UserIcon.Location.Y, 0); Label label2; diff --git a/Luski/GUI/MainScreen/UI/PublicServers/PublicChat.cs b/Luski/GUI/MainScreen/UI/PublicServers/PublicChat.cs index 14d1da8..86976ad 100644 --- a/Luski/GUI/MainScreen/UI/PublicServers/PublicChat.cs +++ b/Luski/GUI/MainScreen/UI/PublicServers/PublicChat.cs @@ -355,7 +355,6 @@ public class PublicChat : UserControl private SocketMessage? lastm; private long? lastUser; - private bool fake = false; public ChatMessage? LastChatMessage; private SocketMessage? lastmIndex; @@ -454,9 +453,8 @@ public class PublicChat : UserControl } lastm = Message; - if (lastUser is null || lastUser != Message.AuthorID || hasbeentenmin || fake != Message.IsProfile) + if (lastUser is null || lastUser != Message.ProfileID || hasbeentenmin) { - if (Window is null || !Globals.ms.InvokeRequired) { MessageFlow.Controls.Add(LastChatMessage = await ChatMessage.MakeChatMessage(this, Message)); @@ -490,8 +488,7 @@ public class PublicChat : UserControl }); } } - fake = Message.IsProfile; - lastUser = Message.AuthorID; + lastUser = Message.ProfileID; } private int index = 0; @@ -504,7 +501,7 @@ public class PublicChat : UserControl Channel!.Epoch.AddMilliseconds(lastmIndex.ID >> 22).ToLocalTime().AddMinutes(10) < Channel!.Epoch.AddMilliseconds(Message.ID >> 22).ToLocalTime(); lastmIndex = Message; - if (lastUserIndex is null || lastUserIndex != Message.AuthorID || hasbeentenmin || fake != Message.IsProfile) + if (lastUserIndex is null || lastUserIndex != Message.ProfileID || hasbeentenmin) { if (Window is null || !Globals.ms.InvokeRequired) { @@ -539,7 +536,6 @@ public class PublicChat : UserControl }); } } - fakeIndex = Message.IsProfile; - lastUserIndex = Message.AuthorID; + lastUserIndex = Message.ProfileID; } } \ No newline at end of file diff --git a/Luski/GUI/MainScreenWindow.cs b/Luski/GUI/MainScreenWindow.cs index 1fa5ac4..71c7c44 100644 --- a/Luski/GUI/MainScreenWindow.cs +++ b/Luski/GUI/MainScreenWindow.cs @@ -259,7 +259,8 @@ public class MainScreenWindow : Window Role[] ra = await Server.User.GetRoles(); Color c = ra[0].Color; Color4 c4 = new(c.R, c.G, c.B, c.A); - IRenderObject u = await Server.User.MakeRct(new(46.ScaleInt()), false); + 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.Size.Y + ii, 0); u.Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left; @@ -269,7 +270,7 @@ public class MainScreenWindow : Window Label ul = new Label(Globals.DefaultFont) { Anchor = u.Anchor, - Text = Server.User.DisplayName, + Text = DefaultProfile.DisplayName, Color = c4 }; diff --git a/Luski/Globals.cs b/Luski/Globals.cs index cc31b91..58d16be 100644 --- a/Luski/Globals.cs +++ b/Luski/Globals.cs @@ -265,22 +265,11 @@ public static class Globals public static Dictionary UserTextureMap = new(); public static Dictionary ProfileTextureMap = new(); - - private static async Task GetIcon(this SocketUser User) - { - if (UserTextureMap.TryGetValue(User.Id, out Texture? t)) return t; - Stream UserStream = await User.GetAvatar(CancellationToken.None); - t = Globals.ms.TextureManager.AddTexture(UserStream); - UserTextureMap.Add(User.Id, t); - UserStream.Dispose(); - t.Unit = TextureUnit.Texture1; - return t; - } - public static async Task MakeRct(this TUser User, Vector2i Size, bool IsProfile) where TUser : IUser + public static async Task MakeRct(this ServerProfile Profile, TUser User, Vector2i Size) where TUser : SocketUser { Texture t = ms.TextureManager.GetTextureResource("Status.png"); - if (User.PictureType == PictureType.none) + if (Profile.PictureType == PictureType.none) { UserControl r = new(t); r.Size = Size; @@ -291,7 +280,7 @@ public static class Globals { Color = c.ToColor4() }; - l.Text = User.DisplayName[0].ToString(); + l.Text = Profile.DisplayName[0].ToString(); var y = l.GetSizeOfChar(0); l.Location = new((r.Size.X - l.Size.X)/2, (int)(r.Size.Y - (l.Font.PixelHeight - y.Y) - (r.Size.Y / 2) - (y.Y/2)), @@ -304,33 +293,20 @@ public static class Globals Rectangle r = new(t); r.Size = Size; r.Shader = Rectangle.DefaultAlphaTextureShader[ms.Context]; - r.Textures.Add(await User.GetIcon(IsProfile)); + r.Textures.Add(await Profile.GetIcon()); return r; } } - private static async Task GetIcon(this IUser User, bool IsProfile) + private static async Task GetIcon(this ServerProfile User) { - if (IsProfile) - { - if (ProfileTextureMap.TryGetValue(User.Id, out Texture? t)) return t; - Stream UserStream = await User.GetAvatar(CancellationToken.None); - t = Globals.ms.TextureManager.AddTexture(UserStream); - ProfileTextureMap.Add(User.Id, t); - UserStream.Dispose(); - t.Unit = TextureUnit.Texture1; - return t; - } - else - { - if (UserTextureMap.TryGetValue(User.Id, out Texture? t)) return t; - Stream UserStream = await User.GetAvatar(CancellationToken.None); - t = Globals.ms.TextureManager.AddTexture(UserStream); - UserTextureMap.Add(User.Id, t); - UserStream.Dispose(); - t.Unit = TextureUnit.Texture1; - return t; - } + if (ProfileTextureMap.TryGetValue(User.ID, out Texture? t)) return t; + Stream UserStream = await User.GetAvatar(CancellationToken.None); + t = Globals.ms.TextureManager.AddTexture(UserStream); + ProfileTextureMap.Add(User.ID, t); + UserStream.Dispose(); + t.Unit = TextureUnit.Texture1; + return t; } public static Settings Settings { get; set; } diff --git a/Luski/Luski.csproj b/Luski/Luski.csproj index 9c2d070..2b332ac 100644 --- a/Luski/Luski.csproj +++ b/Luski/Luski.csproj @@ -22,7 +22,7 @@ - + From 532d21249424cd2481a192569f49f2d8cc38d237 Mon Sep 17 00:00:00 2001 From: JacobTech Date: Sat, 13 Apr 2024 13:11:26 -0400 Subject: [PATCH 2/4] 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? Date: Sat, 13 Apr 2024 13:30:28 -0400 Subject: [PATCH 3/4] Textbox Pointer Fix I made some changes to hopefully keep the pointer in the right location. --- Luski/GUI/MainScreen/UI/LuskiControls/TextBox.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Luski/GUI/MainScreen/UI/LuskiControls/TextBox.cs b/Luski/GUI/MainScreen/UI/LuskiControls/TextBox.cs index f4083e3..0fb71c8 100644 --- a/Luski/GUI/MainScreen/UI/LuskiControls/TextBox.cs +++ b/Luski/GUI/MainScreen/UI/LuskiControls/TextBox.cs @@ -236,6 +236,13 @@ public class TextBox : UserControl _label.Location = _label.Location; } } + + if (_label.Text.Length < CursorLocation) + { + CursorLocation = _label.Text.Length; + var xy = _label.GetCharLocation(CursorLocation); + Pointer.Location = new(_label.Location.X + xy.X, _label.Location.Y + xy.Y, Pointer.Location.Z); + } } } public string WatermarkText @@ -283,8 +290,8 @@ public class TextBox : UserControl Size = new(Size.X, Size.Y - (int)_label.Font.PixelHeight); if (OnRemoveLine is not null) OnRemoveLine.Invoke(); } - Text = Text.Remove(CursorLocation - 1, 1); CursorLocation--; + Text = Text.Remove(CursorLocation, 1); var f = _label.GetCharLocation(CursorLocation); Pointer.Location = _label.Location + new Vector3i(f.X, f.Y, 0); Pointer.Visible = true; From dbd05eff663d1d3907aa938e0e75a367724a6a75 Mon Sep 17 00:00:00 2001 From: JacobTech Date: Sun, 14 Apr 2024 14:15:12 -0400 Subject: [PATCH 4/4] Server Icon Improvements Server icons are now red when the client can't connect to the server. Server icons now support servers without icons. --- Luski/GUI/MainScreen/UI/ServerIcon.cs | 35 ++++++++++++++++------- Luski/GUI/MainScreenWindow.cs | 8 ++++++ Luski/Globals.cs | 40 +++++++++++++++++++++++++++ Luski/Luski.csproj | 2 +- 4 files changed, 74 insertions(+), 11 deletions(-) diff --git a/Luski/GUI/MainScreen/UI/ServerIcon.cs b/Luski/GUI/MainScreen/UI/ServerIcon.cs index 5f9f773..c748036 100644 --- a/Luski/GUI/MainScreen/UI/ServerIcon.cs +++ b/Luski/GUI/MainScreen/UI/ServerIcon.cs @@ -5,6 +5,7 @@ using GraphicsManager.Objects; using GraphicsManager.Objects.Core; using Luski.net; using OpenTK.Graphics.OpenGL4; +using OpenTK.Mathematics; namespace Luski.GUI.MainScreen.UI; @@ -45,15 +46,30 @@ public class ServerIcon : UserControl where TServer : Server } } - public ServerIcon(TServer Server) + public ServerIcon(TServer Server, bool Failed = false) { - Rectangle r = new(Globals.ms.TextureManager.GetTextureResource("rc.png")) + Rectangle r; + if (Server is PublicServer ps) { - Location = new(18.ScaleInt(), 8.ScaleInt(), 0), - Size = new(32.ScaleInt()), - Shader = Rectangle.DefaultAlphaTextureShader[Globals.ms.Context], - IgnoreHover = true - }; + var rpre = ps.MakeRct(new(32.ScaleInt())); + Task.WaitAll(rpre); + r = (Rectangle)rpre.Result; + } + else + { + r = new(Globals.ms.TextureManager.GetTextureResource("rc.png")) + { + Size = new(32.ScaleInt()), + Shader = Rectangle.DefaultAlphaTextureShader[Globals.ms.Context], + IgnoreHover = true + }; + Texture t = Globals.ms.TextureManager.AddTexture(Server.GetAvatar(CancellationToken.None).Result); + t.Unit = TextureUnit.Texture1; + r.Textures.Add(t); + } + + r.Location = new(18.ScaleInt(), 8.ScaleInt(), 0); + r.IgnoreHover = true; Rectangle rr = new(r.Textures[0]) { Location = new(17.ScaleInt(), 7.ScaleInt(), 0), @@ -70,10 +86,9 @@ public class ServerIcon : UserControl where TServer : Server BackgroundColor = new(26, 26, 26, 255), IgnoreHover = true }; + if (Failed) SelectedRect.BackgroundColor = Color4.DarkRed; this.Server = Server; - Texture t = Globals.ms.TextureManager.AddTexture(Server.GetAvatar(CancellationToken.None).Result); - t.Unit = TextureUnit.Texture1; - r.Textures.Add(t); + Controls.Add(SelectedRect); Controls.Add(rr); Controls.Add(r); diff --git a/Luski/GUI/MainScreenWindow.cs b/Luski/GUI/MainScreenWindow.cs index 0bd90e6..f98b4d8 100644 --- a/Luski/GUI/MainScreenWindow.cs +++ b/Luski/GUI/MainScreenWindow.cs @@ -442,6 +442,14 @@ public class MainScreenWindow : Window si.LoadToParent(ser, this); } + foreach (PublicServer pser in Globals.Luski.FailedServers) + { + Console.WriteLine(pser.Name); + ServerIcon si = new ServerIcon(pser, true); + ser.Controls.Add(si); + si.LoadToParent(ser, this); + } + AddServerIcon asi = new(); asi.Clicked += AddButtonClicked; ser.Controls.Add(asi); diff --git a/Luski/Globals.cs b/Luski/Globals.cs index 97cb998..21ac3e6 100644 --- a/Luski/Globals.cs +++ b/Luski/Globals.cs @@ -300,6 +300,46 @@ public static class Globals } } + public static async Task MakeRct(this PublicServer Server, Vector2i Size) + { + Texture t = ms.TextureManager.GetTextureResource("rc.png"); + if (Server.PictureType == PictureType.none) + { + UserControl r = new(t); + r.Size = Size; + r.Shader = Rectangle.DefaultAlphaShader[ms.Context]; + r.BackgroundColor = new(25, 25, 25, 255); + Label l = new(DefaultFont) + { + Color = new(255,255,255,255) + }; + l.Text = Server.Name[0].ToString(); + var y = l.GetSizeOfChar(0); + l.Location = new((r.Size.X - l.Size.X)/2, + (int)(r.Size.Y - (l.Font.PixelHeight - y.Y) - (r.Size.Y / 2) - (y.Y/2)), + 0); + r.Controls.Add(l); + return r; + } + else + { + Rectangle r = new(t); + r.Size = Size; + r.Shader = Rectangle.DefaultAlphaTextureShader[ms.Context]; + r.Textures.Add(await Server.GetIcon()); + return r; + } + } + + private static async Task GetIcon(this TServer Server) where TServer : Server + { + Stream UserStream = await Server.GetAvatar(CancellationToken.None); + Texture t = Globals.ms.TextureManager.AddTexture(UserStream); + UserStream.Dispose(); + t.Unit = TextureUnit.Texture1; + return t; + } + private static async Task GetIcon(this ServerProfile User) { if (ProfileTextureMap.TryGetValue(User.ID, out Texture? t)) return t; diff --git a/Luski/Luski.csproj b/Luski/Luski.csproj index d8aa17f..0afaad2 100644 --- a/Luski/Luski.csproj +++ b/Luski/Luski.csproj @@ -22,7 +22,7 @@ - +