From c3b7cde53b8d46ae18725659d4499462220cc5fd Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 20 Mar 2018 12:54:34 +1100 Subject: [PATCH] Fix highlighted server hash changing with search filters (Thanks Odd0002) --- Launcher2/Gui/Screens/ServersScreen.cs | 7 ++-- Launcher2/Gui/TableWidget/TableView.cs | 22 ++++++----- Launcher2/Gui/TableWidget/TableWidget.cs | 47 +++++++++++++----------- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/Launcher2/Gui/Screens/ServersScreen.cs b/Launcher2/Gui/Screens/ServersScreen.cs index e4edc55b1..79e55d82d 100644 --- a/Launcher2/Gui/Screens/ServersScreen.cs +++ b/Launcher2/Gui/Screens/ServersScreen.cs @@ -79,7 +79,7 @@ namespace Launcher.Gui.Screens { if (e.Key == Key.Enter) { string curServer = Get(view.hashIndex) ?? ""; if (table.Count >= 1 && curServer == "") { - widgets[view.hashIndex].Text = table.usedEntries[0].Hash; + widgets[view.hashIndex].Text = table.Get(0).Hash; ConnectToServer(0, 0); } else if (curServer != "" && (selectedWidget == null || selectedWidget == widgets[view.tableIndex])) { @@ -139,10 +139,11 @@ namespace Launcher.Gui.Screens { void SwitchToMain(int x, int y) { game.SetScreen(new MainScreen(game)); } void FilterList() { - if (curInput != widgets[view.searchIndex]) - return; + if (curInput != widgets[view.searchIndex]) return; + TableWidget table = (TableWidget)widgets[view.tableIndex]; table.FilterEntries(curInput.Text); + table.SetSelected(table.SelectedHash); MarkPendingRedraw(); } diff --git a/Launcher2/Gui/TableWidget/TableView.cs b/Launcher2/Gui/TableWidget/TableView.cs index c324dd751..ea3e55dbe 100644 --- a/Launcher2/Gui/TableWidget/TableView.cs +++ b/Launcher2/Gui/TableWidget/TableView.cs @@ -52,8 +52,8 @@ namespace Launcher.Gui.Widgets { maxIndex = i; return; } - table.usedEntries[i].Y = y; - table.usedEntries[i].Height = entryHeight; + table.entries[table.order[i]].Y = y; + table.entries[table.order[i]].Height = entryHeight; y += entryHeight + 2; } } @@ -97,10 +97,11 @@ namespace Launcher.Gui.Widgets { public void DrawFlags() { using (FastBitmap dst = game.LockBits()) { for (int i = table.CurrentIndex; i < maxIndex; i++) { - int x = table.X, y = table.usedEntries[i].Y; - FastBitmap flag = GetFlag(table.usedEntries[i].Flag); + TableEntry entry = table.Get(i); + FastBitmap flag = GetFlag(entry.Flag); if (flag == null) continue; + int x = table.X, y = entry.Y; Rectangle rect = new Rectangle(x + 2, y + 3, 16, 11); BitmapDrawer.Draw(flag, dst, rect); } @@ -119,13 +120,14 @@ namespace Launcher.Gui.Widgets { y += 5; for (int i = table.CurrentIndex; i < table.Count; i++) { - args = new DrawTextArgs(filter(table.usedEntries[i]), font, true); - if ((i == table.SelectedIndex || table.entries[i].Featured) && !separator) { + TableEntry entry = table.Get(i); + args = new DrawTextArgs(filter(entry), font, true); + if ((i == table.SelectedIndex || entry.Featured) && !separator) { int startY = y - 3; int height = Math.Min(startY + (entryHeight + 4), table.Y + table.Height) - startY; - drawer.Clear(GetGridCol(table.entries[i].Featured, i == table.SelectedIndex), table.X, startY, table.Width, height); + drawer.Clear(GetGridCol(entry.Featured, i == table.SelectedIndex), table.X, startY, table.Width, height); } - if (!DrawColumnEntry(drawer, ref args, maxWidth, x, ref y, ref table.usedEntries[i])) { + if (!DrawColumnEntry(drawer, ref args, maxWidth, x, ref y, ref entry)) { maxIndex = i; break; } } @@ -166,8 +168,8 @@ namespace Launcher.Gui.Widgets { void ResetEntries() { for (int i = 0; i < table.Count; i++) { - table.entries[i].Height = 0; table.usedEntries[i].Height = 0; - table.entries[i].Y = -10; table.usedEntries[i].Y = -10; + table.entries[i].Height = 0; + table.entries[i].Y = -10; } } diff --git a/Launcher2/Gui/TableWidget/TableWidget.cs b/Launcher2/Gui/TableWidget/TableWidget.cs index ca4fba069..25def26b2 100644 --- a/Launcher2/Gui/TableWidget/TableWidget.cs +++ b/Launcher2/Gui/TableWidget/TableWidget.cs @@ -30,14 +30,15 @@ namespace Launcher.Gui.Widgets { public string SelectedHash = ""; public int CurrentIndex, Count; - internal TableEntry[] entries, usedEntries; - internal List servers; + internal TableEntry[] entries; + internal int[] order; + internal List servers; + internal TableEntry Get(int i) { return entries[order[i]]; } public void SetEntries(List servers) { entries = new TableEntry[servers.Count]; - usedEntries = new TableEntry[servers.Count]; + order = new int[servers.Count]; this.servers = servers; - int index = 0; for (int i = 0; i < servers.Count; i++) { ServerListEntry e = servers[i]; @@ -51,25 +52,25 @@ namespace Launcher.Gui.Widgets { tableEntry.Featured = e.Featured; tableEntry.Flag = e.Flag; - entries[index] = tableEntry; - usedEntries[index] = tableEntry; - index++; + entries[i] = tableEntry; + order[i] = i; } Count = entries.Length; } + string curFilter; public void FilterEntries(string filter) { + curFilter = filter; Count = 0; - int index = 0; - for (int i = 0; i < entries.Length; i++) { TableEntry entry = entries[i]; if (entry.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0) { - Count++; - usedEntries[index++] = entry; + order[Count++] = i; } } - SetSelected(SelectedHash); + for (int i = Count; i < entries.Length; i++) { + order[i] = -100000; + } } internal void GetScrollbarCoords(out int y, out int height) { @@ -93,18 +94,18 @@ namespace Launcher.Gui.Widgets { ClampIndex(); if (Count > 0) { - SelectedChanged(usedEntries[index].Hash); - SelectedHash = usedEntries[index].Hash; + TableEntry entry = Get(index); + SelectedChanged(entry.Hash); + SelectedHash = entry.Hash; } } public void SetSelected(string hash) { SelectedIndex = -1; for (int i = 0; i < Count; i++) { - if (usedEntries[i].Hash == hash) { - SetSelected(i); - return; - } + if (Get(i).Hash != hash) continue; + SetSelected(i); + return; } } @@ -194,11 +195,13 @@ namespace Launcher.Gui.Widgets { } void SortEntries(TableEntryComparer comparer, bool noRedraw) { - Array.Sort(usedEntries, 0, Count, comparer); Array.Sort(entries, 0, entries.Length, comparer); - lastIndex = -10; - if (noRedraw) return; + lastIndex = -10; + if (curFilter != null && curFilter.Length > 0) { + FilterEntries(curFilter); + } + if (noRedraw) return; comparer.Invert = !comparer.Invert; SetSelected(SelectedHash); NeedRedraw(); @@ -206,7 +209,7 @@ namespace Launcher.Gui.Widgets { void GetSelectedServer(int mouseX, int mouseY) { for (int i = 0; i < Count; i++) { - TableEntry entry = usedEntries[i]; + TableEntry entry = Get(i); if (mouseY < entry.Y || mouseY >= entry.Y + entry.Height + 2) continue; if (lastIndex == i && (DateTime.UtcNow - lastPress).TotalSeconds < 1) {