mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-18 12:05:14 -04:00
Fix highlighted server hash changing with search filters (Thanks Odd0002)
This commit is contained in:
parent
046f334187
commit
c3b7cde53b
@ -79,7 +79,7 @@ namespace Launcher.Gui.Screens {
|
|||||||
if (e.Key == Key.Enter) {
|
if (e.Key == Key.Enter) {
|
||||||
string curServer = Get(view.hashIndex) ?? "";
|
string curServer = Get(view.hashIndex) ?? "";
|
||||||
if (table.Count >= 1 && curServer == "") {
|
if (table.Count >= 1 && curServer == "") {
|
||||||
widgets[view.hashIndex].Text = table.usedEntries[0].Hash;
|
widgets[view.hashIndex].Text = table.Get(0).Hash;
|
||||||
ConnectToServer(0, 0);
|
ConnectToServer(0, 0);
|
||||||
} else if (curServer != "" &&
|
} else if (curServer != "" &&
|
||||||
(selectedWidget == null || selectedWidget == widgets[view.tableIndex])) {
|
(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 SwitchToMain(int x, int y) { game.SetScreen(new MainScreen(game)); }
|
||||||
|
|
||||||
void FilterList() {
|
void FilterList() {
|
||||||
if (curInput != widgets[view.searchIndex])
|
if (curInput != widgets[view.searchIndex]) return;
|
||||||
return;
|
|
||||||
TableWidget table = (TableWidget)widgets[view.tableIndex];
|
TableWidget table = (TableWidget)widgets[view.tableIndex];
|
||||||
table.FilterEntries(curInput.Text);
|
table.FilterEntries(curInput.Text);
|
||||||
|
table.SetSelected(table.SelectedHash);
|
||||||
MarkPendingRedraw();
|
MarkPendingRedraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,8 +52,8 @@ namespace Launcher.Gui.Widgets {
|
|||||||
maxIndex = i; return;
|
maxIndex = i; return;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.usedEntries[i].Y = y;
|
table.entries[table.order[i]].Y = y;
|
||||||
table.usedEntries[i].Height = entryHeight;
|
table.entries[table.order[i]].Height = entryHeight;
|
||||||
y += entryHeight + 2;
|
y += entryHeight + 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -97,10 +97,11 @@ namespace Launcher.Gui.Widgets {
|
|||||||
public void DrawFlags() {
|
public void DrawFlags() {
|
||||||
using (FastBitmap dst = game.LockBits()) {
|
using (FastBitmap dst = game.LockBits()) {
|
||||||
for (int i = table.CurrentIndex; i < maxIndex; i++) {
|
for (int i = table.CurrentIndex; i < maxIndex; i++) {
|
||||||
int x = table.X, y = table.usedEntries[i].Y;
|
TableEntry entry = table.Get(i);
|
||||||
FastBitmap flag = GetFlag(table.usedEntries[i].Flag);
|
FastBitmap flag = GetFlag(entry.Flag);
|
||||||
if (flag == null) continue;
|
if (flag == null) continue;
|
||||||
|
|
||||||
|
int x = table.X, y = entry.Y;
|
||||||
Rectangle rect = new Rectangle(x + 2, y + 3, 16, 11);
|
Rectangle rect = new Rectangle(x + 2, y + 3, 16, 11);
|
||||||
BitmapDrawer.Draw(flag, dst, rect);
|
BitmapDrawer.Draw(flag, dst, rect);
|
||||||
}
|
}
|
||||||
@ -119,13 +120,14 @@ namespace Launcher.Gui.Widgets {
|
|||||||
|
|
||||||
y += 5;
|
y += 5;
|
||||||
for (int i = table.CurrentIndex; i < table.Count; i++) {
|
for (int i = table.CurrentIndex; i < table.Count; i++) {
|
||||||
args = new DrawTextArgs(filter(table.usedEntries[i]), font, true);
|
TableEntry entry = table.Get(i);
|
||||||
if ((i == table.SelectedIndex || table.entries[i].Featured) && !separator) {
|
args = new DrawTextArgs(filter(entry), font, true);
|
||||||
|
if ((i == table.SelectedIndex || entry.Featured) && !separator) {
|
||||||
int startY = y - 3;
|
int startY = y - 3;
|
||||||
int height = Math.Min(startY + (entryHeight + 4), table.Y + table.Height) - startY;
|
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;
|
maxIndex = i; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,8 +168,8 @@ namespace Launcher.Gui.Widgets {
|
|||||||
|
|
||||||
void ResetEntries() {
|
void ResetEntries() {
|
||||||
for (int i = 0; i < table.Count; i++) {
|
for (int i = 0; i < table.Count; i++) {
|
||||||
table.entries[i].Height = 0; table.usedEntries[i].Height = 0;
|
table.entries[i].Height = 0;
|
||||||
table.entries[i].Y = -10; table.usedEntries[i].Y = -10;
|
table.entries[i].Y = -10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,14 +30,15 @@ namespace Launcher.Gui.Widgets {
|
|||||||
public string SelectedHash = "";
|
public string SelectedHash = "";
|
||||||
public int CurrentIndex, Count;
|
public int CurrentIndex, Count;
|
||||||
|
|
||||||
internal TableEntry[] entries, usedEntries;
|
internal TableEntry[] entries;
|
||||||
internal List<ServerListEntry> servers;
|
internal int[] order;
|
||||||
|
internal List<ServerListEntry> servers;
|
||||||
|
internal TableEntry Get(int i) { return entries[order[i]]; }
|
||||||
|
|
||||||
public void SetEntries(List<ServerListEntry> servers) {
|
public void SetEntries(List<ServerListEntry> servers) {
|
||||||
entries = new TableEntry[servers.Count];
|
entries = new TableEntry[servers.Count];
|
||||||
usedEntries = new TableEntry[servers.Count];
|
order = new int[servers.Count];
|
||||||
this.servers = servers;
|
this.servers = servers;
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < servers.Count; i++) {
|
for (int i = 0; i < servers.Count; i++) {
|
||||||
ServerListEntry e = servers[i];
|
ServerListEntry e = servers[i];
|
||||||
@ -51,25 +52,25 @@ namespace Launcher.Gui.Widgets {
|
|||||||
tableEntry.Featured = e.Featured;
|
tableEntry.Featured = e.Featured;
|
||||||
tableEntry.Flag = e.Flag;
|
tableEntry.Flag = e.Flag;
|
||||||
|
|
||||||
entries[index] = tableEntry;
|
entries[i] = tableEntry;
|
||||||
usedEntries[index] = tableEntry;
|
order[i] = i;
|
||||||
index++;
|
|
||||||
}
|
}
|
||||||
Count = entries.Length;
|
Count = entries.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string curFilter;
|
||||||
public void FilterEntries(string filter) {
|
public void FilterEntries(string filter) {
|
||||||
|
curFilter = filter;
|
||||||
Count = 0;
|
Count = 0;
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < entries.Length; i++) {
|
for (int i = 0; i < entries.Length; i++) {
|
||||||
TableEntry entry = entries[i];
|
TableEntry entry = entries[i];
|
||||||
if (entry.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0) {
|
if (entry.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0) {
|
||||||
Count++;
|
order[Count++] = i;
|
||||||
usedEntries[index++] = entry;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetSelected(SelectedHash);
|
for (int i = Count; i < entries.Length; i++) {
|
||||||
|
order[i] = -100000;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void GetScrollbarCoords(out int y, out int height) {
|
internal void GetScrollbarCoords(out int y, out int height) {
|
||||||
@ -93,18 +94,18 @@ namespace Launcher.Gui.Widgets {
|
|||||||
ClampIndex();
|
ClampIndex();
|
||||||
|
|
||||||
if (Count > 0) {
|
if (Count > 0) {
|
||||||
SelectedChanged(usedEntries[index].Hash);
|
TableEntry entry = Get(index);
|
||||||
SelectedHash = usedEntries[index].Hash;
|
SelectedChanged(entry.Hash);
|
||||||
|
SelectedHash = entry.Hash;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetSelected(string hash) {
|
public void SetSelected(string hash) {
|
||||||
SelectedIndex = -1;
|
SelectedIndex = -1;
|
||||||
for (int i = 0; i < Count; i++) {
|
for (int i = 0; i < Count; i++) {
|
||||||
if (usedEntries[i].Hash == hash) {
|
if (Get(i).Hash != hash) continue;
|
||||||
SetSelected(i);
|
SetSelected(i);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,11 +195,13 @@ namespace Launcher.Gui.Widgets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SortEntries(TableEntryComparer comparer, bool noRedraw) {
|
void SortEntries(TableEntryComparer comparer, bool noRedraw) {
|
||||||
Array.Sort(usedEntries, 0, Count, comparer);
|
|
||||||
Array.Sort(entries, 0, entries.Length, comparer);
|
Array.Sort(entries, 0, entries.Length, comparer);
|
||||||
lastIndex = -10;
|
lastIndex = -10;
|
||||||
if (noRedraw) return;
|
if (curFilter != null && curFilter.Length > 0) {
|
||||||
|
FilterEntries(curFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (noRedraw) return;
|
||||||
comparer.Invert = !comparer.Invert;
|
comparer.Invert = !comparer.Invert;
|
||||||
SetSelected(SelectedHash);
|
SetSelected(SelectedHash);
|
||||||
NeedRedraw();
|
NeedRedraw();
|
||||||
@ -206,7 +209,7 @@ namespace Launcher.Gui.Widgets {
|
|||||||
|
|
||||||
void GetSelectedServer(int mouseX, int mouseY) {
|
void GetSelectedServer(int mouseX, int mouseY) {
|
||||||
for (int i = 0; i < Count; i++) {
|
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 (mouseY < entry.Y || mouseY >= entry.Y + entry.Height + 2) continue;
|
||||||
|
|
||||||
if (lastIndex == i && (DateTime.UtcNow - lastPress).TotalSeconds < 1) {
|
if (lastIndex == i && (DateTime.UtcNow - lastPress).TotalSeconds < 1) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user