mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-15 18:45:23 -04:00
Add uptime sorting to new launcher.
This commit is contained in:
parent
83af1b5a2d
commit
25fe4e68ac
@ -18,6 +18,9 @@ namespace Launcher2 {
|
||||
}
|
||||
|
||||
public override void Tick() {
|
||||
LauncherTableWidget table = (LauncherTableWidget)widgets[tableIndex];
|
||||
if( table.DraggingWidth && !game.Window.Mouse[MouseButton.Left] )
|
||||
table.DraggingWidth = false;
|
||||
}
|
||||
|
||||
protected override void MouseMove( object sender, MouseMoveEventArgs e ) {
|
||||
|
@ -8,46 +8,63 @@ namespace Launcher2 {
|
||||
|
||||
NameComparer nameComp = new NameComparer();
|
||||
PlayersComparer playerComp = new PlayersComparer();
|
||||
UptimeComparer uptimeComp = new UptimeComparer();
|
||||
public bool DraggingWidth = false;
|
||||
|
||||
void HandleOnClick( int mouseX, int mouseY ) {
|
||||
if( mouseX >= Window.Width - 10 ) {
|
||||
ScrollbarClick( mouseY );
|
||||
lastIndex = -10;
|
||||
return;
|
||||
lastIndex = -10; return;
|
||||
}
|
||||
|
||||
if( mouseY >= headerStartY && mouseY < headerEndY ) {
|
||||
if( mouseX < ColumnWidths[0] - 10 ) {
|
||||
Array.Sort( usedEntries, 0, Count, nameComp );
|
||||
Array.Sort( entries, 0, entries.Length, nameComp );
|
||||
nameComp.Invert = !nameComp.Invert;
|
||||
NeedRedraw();
|
||||
} else if( mouseX > ColumnWidths[0] + 10 ) {
|
||||
Array.Sort( usedEntries, 0, Count, playerComp );
|
||||
Array.Sort( entries, 0, entries.Length, playerComp );
|
||||
playerComp.Invert = !playerComp.Invert;
|
||||
NeedRedraw();
|
||||
} else {
|
||||
DraggingWidth = true;
|
||||
}
|
||||
lastIndex = -10;
|
||||
SelectHeader( mouseX, mouseY );
|
||||
} else {
|
||||
for( int i = 0; i < Count; i++ ) {
|
||||
TableEntry entry = usedEntries[i];
|
||||
if( mouseY >= entry.Y && mouseY < entry.Y + entry.Height ) {
|
||||
if( lastIndex == i && (DateTime.UtcNow - lastPress).TotalSeconds > 1 ) {
|
||||
Window.ConnectToServer( servers, entry.Hash );
|
||||
lastPress = DateTime.UtcNow;
|
||||
}
|
||||
SelectedChanged( entry.Hash );
|
||||
SelectedHash = entry.Hash;
|
||||
|
||||
NeedRedraw();
|
||||
lastIndex = i;
|
||||
break;
|
||||
}
|
||||
GetSelectedServer( mouseX, mouseY );
|
||||
}
|
||||
}
|
||||
|
||||
void SelectHeader( int mouseX, int mouseY ) {
|
||||
int x = 0;
|
||||
lastIndex = -10;
|
||||
|
||||
if( mouseX >= x && mouseX < x + ColumnWidths[0] - 10 ) {
|
||||
SortEntries( nameComp ); return;
|
||||
}
|
||||
x += ColumnWidths[0];
|
||||
if( mouseX >= x + 15 && mouseX < x + ColumnWidths[1] ) {
|
||||
SortEntries( playerComp ); return;
|
||||
}
|
||||
x += ColumnWidths[1];
|
||||
if( mouseX >= x ) {
|
||||
SortEntries( uptimeComp ); return;
|
||||
}
|
||||
|
||||
DraggingWidth = true;
|
||||
}
|
||||
|
||||
void SortEntries( TableEntryComparer comparer ) {
|
||||
Array.Sort( usedEntries, 0, Count, comparer );
|
||||
Array.Sort( entries, 0, entries.Length, comparer );
|
||||
comparer.Invert = !comparer.Invert;
|
||||
NeedRedraw();
|
||||
}
|
||||
|
||||
void GetSelectedServer( int mouseX, int mouseY ) {
|
||||
for( int i = 0; i < Count; i++ ) {
|
||||
TableEntry entry = usedEntries[i];
|
||||
if( mouseY < entry.Y || mouseY >= entry.Y + entry.Height ) continue;
|
||||
|
||||
if( lastIndex == i && (DateTime.UtcNow - lastPress).TotalSeconds > 1 ) {
|
||||
Window.ConnectToServer( servers, entry.Hash );
|
||||
lastPress = DateTime.UtcNow;
|
||||
}
|
||||
SelectedChanged( entry.Hash );
|
||||
SelectedHash = entry.Hash;
|
||||
|
||||
NeedRedraw();
|
||||
lastIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,7 @@ namespace Launcher2 {
|
||||
tableEntry.Hash = e.Hash;
|
||||
tableEntry.Name = e.Name;
|
||||
tableEntry.Players = e.Players + "/" + e.MaximumPlayers;
|
||||
tableEntry.Uptime = MakeUptime( e.Uptime );
|
||||
|
||||
entries[index] = tableEntry;
|
||||
usedEntries[index] = tableEntry;
|
||||
@ -36,7 +37,7 @@ namespace Launcher2 {
|
||||
Count = entries.Length;
|
||||
}
|
||||
|
||||
/// <summary> Filters the table such that only rows with server names
|
||||
/// <summary> Filters the table such that only rows with server names
|
||||
/// that contain the input (case insensitive) are shown. </summary>
|
||||
public void FilterEntries( string filter ) {
|
||||
Count = 0;
|
||||
@ -52,11 +53,11 @@ namespace Launcher2 {
|
||||
}
|
||||
|
||||
public int CurrentIndex, Count;
|
||||
public int[] ColumnWidths = { 350, 100 };
|
||||
public int[] DesiredColumnWidths = { 350, 100 };
|
||||
public int[] ColumnWidths = { 280, 80, 80 };
|
||||
public int[] DesiredColumnWidths = { 280, 80, 80 };
|
||||
|
||||
struct TableEntry {
|
||||
public string Hash, Name, Players;
|
||||
public string Hash, Name, Players, Uptime;
|
||||
public int Y, Height;
|
||||
}
|
||||
|
||||
@ -74,8 +75,12 @@ namespace Launcher2 {
|
||||
int x = X + 5;
|
||||
|
||||
DrawGrid( drawer, font, titleFont );
|
||||
x += DrawColumn( drawer, true, font, titleFont, boldFont, "Name", ColumnWidths[0], x, e => e.Name ) + 5;
|
||||
x += DrawColumn( drawer, false, font, titleFont, boldFont, "Players", ColumnWidths[1], x, e => e.Players ) + 5;
|
||||
x += DrawColumn( drawer, true, font, titleFont, boldFont,
|
||||
"Name", ColumnWidths[0], x, e => e.Name ) + 5;
|
||||
x += DrawColumn( drawer, true, font, titleFont, boldFont,
|
||||
"Players", ColumnWidths[1], x, e => e.Players ) + 5;
|
||||
x += DrawColumn( drawer, false, font, titleFont, boldFont,
|
||||
"Uptime", ColumnWidths[2], x, e => e.Uptime ) + 5;
|
||||
|
||||
Width = Window.Width;
|
||||
DrawScrollbar( drawer );
|
||||
@ -92,7 +97,7 @@ namespace Launcher2 {
|
||||
for( int i = CurrentIndex; i < Count; i++ ) {
|
||||
args = new DrawTextArgs( filter( usedEntries[i] ), font, true );
|
||||
if( usedEntries[i].Hash == SelectedHash ) {
|
||||
args.Font = boldFont;
|
||||
args.Font = boldFont;
|
||||
}
|
||||
if( !DrawColumnEntry( drawer, ref args, maxWidth, x, ref y, ref usedEntries[i] ) ) {
|
||||
maxIndex = i;
|
||||
@ -136,7 +141,7 @@ namespace Launcher2 {
|
||||
size = drawer.MeasureSize( ref args );
|
||||
|
||||
numEntries = 0;
|
||||
for( ; ; ) {
|
||||
for( ; ; ) {
|
||||
if( y + size.Height > Window.Height ) break;
|
||||
numEntries++;
|
||||
drawer.DrawRect( foreCol, 0, y, Window.Width, 1 );
|
||||
@ -161,27 +166,69 @@ namespace Launcher2 {
|
||||
CurrentIndex = 0;
|
||||
}
|
||||
|
||||
class NameComparer : IComparer<TableEntry> {
|
||||
string MakeUptime( string rawSeconds ) {
|
||||
TimeSpan t = TimeSpan.FromSeconds( Double.Parse( rawSeconds ) );
|
||||
if( t.TotalHours >= 24 * 7 )
|
||||
return (int)t.TotalDays + "d";
|
||||
if( t.TotalHours >= 1 )
|
||||
return (int)t.TotalHours + "h";
|
||||
if( t.TotalMinutes >= 1 )
|
||||
return (int)t.TotalMinutes + "m";
|
||||
return (int)t.TotalSeconds + "s";
|
||||
}
|
||||
|
||||
abstract class TableEntryComparer : IComparer<TableEntry> {
|
||||
|
||||
public bool Invert = false;
|
||||
|
||||
public int Compare( TableEntry a, TableEntry b ) {
|
||||
public abstract int Compare( TableEntry a, TableEntry b );
|
||||
}
|
||||
|
||||
sealed class NameComparer : TableEntryComparer {
|
||||
|
||||
public override int Compare( TableEntry a, TableEntry b ) {
|
||||
StringComparison comparison = StringComparison.CurrentCultureIgnoreCase;
|
||||
int value = String.Compare( a.Name, b.Name, comparison );
|
||||
return Invert ? -value : value;
|
||||
}
|
||||
}
|
||||
|
||||
class PlayersComparer : IComparer<TableEntry> {
|
||||
sealed class PlayersComparer : TableEntryComparer {
|
||||
|
||||
public bool Invert = false;
|
||||
|
||||
public int Compare( TableEntry a, TableEntry b ) {
|
||||
public override int Compare( TableEntry a, TableEntry b ) {
|
||||
long valX = Int64.Parse( a.Players.Substring( 0, a.Players.IndexOf( '/' ) ) );
|
||||
long valY = Int64.Parse( b.Players.Substring( 0, b.Players.IndexOf( '/' ) ) );
|
||||
int value = valX.CompareTo( valY );
|
||||
return Invert ? -value : value;
|
||||
}
|
||||
}
|
||||
|
||||
sealed class UptimeComparer : TableEntryComparer {
|
||||
|
||||
public override int Compare( TableEntry a, TableEntry b ) {
|
||||
TimeSpan valX = ParseUptimeString( a.Uptime );
|
||||
TimeSpan valY = ParseUptimeString( b.Uptime );
|
||||
int value = valX.CompareTo( valY );
|
||||
return Invert ? -value : value;
|
||||
}
|
||||
|
||||
static TimeSpan ParseUptimeString( string s ) {
|
||||
int sum = 0;
|
||||
for( int i = 0; i < s.Length - 1; i++ ) {
|
||||
sum *= 10;
|
||||
sum += s[i] - '0';
|
||||
}
|
||||
|
||||
char timeType = s[s.Length - 1];
|
||||
switch( timeType ) {
|
||||
case 'w' : return TimeSpan.FromDays( sum * 7 );
|
||||
case 'd' : return TimeSpan.FromDays( sum );
|
||||
case 'h' : return TimeSpan.FromHours( sum );
|
||||
case 'm' : return TimeSpan.FromMinutes( sum );
|
||||
case 's' : return TimeSpan.FromSeconds( sum );
|
||||
default: throw new NotSupportedException( "unsupported uptime type: " + timeType );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,7 +19,7 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<BaseAddress>4194304</BaseAddress>
|
||||
<RegisterForComInterop>False</RegisterForComInterop>
|
||||
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
|
||||
|
Loading…
x
Reference in New Issue
Block a user