Fix highlighted server hash changing with search filters (Thanks Odd0002)

This commit is contained in:
UnknownShadow200 2018-03-20 12:54:34 +11:00
parent 046f334187
commit c3b7cde53b
3 changed files with 41 additions and 35 deletions

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -30,14 +30,15 @@ namespace Launcher.Gui.Widgets {
public string SelectedHash = "";
public int CurrentIndex, Count;
internal TableEntry[] entries, usedEntries;
internal TableEntry[] entries;
internal int[] order;
internal List<ServerListEntry> servers;
internal TableEntry Get(int i) { return entries[order[i]]; }
public void SetEntries(List<ServerListEntry> 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,20 +94,20 @@ 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) {
if (Get(i).Hash != hash) continue;
SetSelected(i);
return;
}
}
}
public void ClampIndex() {
if (CurrentIndex > Count - view.numEntries)
@ -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;
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) {