ClassiCube/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs
UnknownShadow200 a13d3147bc Use gui.png.
2015-11-30 14:16:48 +11:00

125 lines
3.4 KiB
C#

using System;
using System.Drawing;
using OpenTK.Input;
using System.IO;
namespace ClassicalSharp {
public sealed class SaveLevelScreen : MenuScreen {
public SaveLevelScreen( Game game ) : base( game ) {
}
MenuInputWidget inputWidget;
Font hintFont;
TextWidget descWidget;
public override void Render( double delta ) {
RenderMenuBounds();
graphicsApi.Texturing = true;
RenderMenuButtons( delta );
inputWidget.Render( delta );
if( descWidget != null )
descWidget.Render( delta );
graphicsApi.Texturing = false;
if( textPath != null ) {
SaveMap( textPath );
textPath = null;
}
}
public override bool HandlesKeyPress( char key ) {
return inputWidget.HandlesKeyPress( key );
}
public override bool HandlesKeyDown( Key key ) {
if( key == Key.Escape ) {
game.SetNewScreen( null );
return true;
}
return inputWidget.HandlesKeyDown( key );
}
public override bool HandlesKeyUp( Key key ) {
return inputWidget.HandlesKeyUp( key );
}
public override void Init() {
game.Keyboard.KeyRepeat = true;
base.Init();
regularFont = new Font( "Arial", 16, FontStyle.Regular );
hintFont = new Font( "Arial", 14, FontStyle.Italic );
inputWidget = MenuInputWidget.Create(
game, -30, 50, 500, 25, "", Anchor.Centre, Anchor.Centre,
regularFont, titleFont, hintFont, new PathValidator() );
buttons = new [] {
ButtonWidget.Create( game, 260, 50, 60, 30, "Save", Anchor.Centre,
Anchor.Centre, titleFont, OkButtonClick ),
MakeBack( false, titleFont,
(g, w) => g.SetNewScreen( new PauseScreen( g ) ) ),
};
}
public override void OnResize( int oldWidth, int oldHeight, int width, int height ) {
inputWidget.OnResize( oldWidth, oldHeight, width, height );
base.OnResize( oldWidth, oldHeight, width, height );
}
public override void Dispose() {
game.Keyboard.KeyRepeat = false;
inputWidget.Dispose();
hintFont.Dispose();
DisposeDescWidget();
base.Dispose();
}
void OkButtonClick( Game game, Widget widget ) {
string text = inputWidget.GetText();
if( text.Length == 0 ) {
MakeDescWidget( "Please enter a filename" );
return;
}
text = Path.ChangeExtension( text, ".cw" );
if( File.Exists( text ) ) {
MakeDescWidget( "&eFilename already exists" );
} else {
// NOTE: We don't immediately save here, because otherwise the 'saving...'
// will not be rendered in time because saving is done on the main thread.
MakeDescWidget( "Saving.." );
textPath = text;
}
}
string textPath;
void SaveMap( string path ) {
try {
using( FileStream fs = new FileStream( path, FileMode.CreateNew, FileAccess.Write ) ) {
IMapFileFormat map = new MapCw();
map.Save( fs, game );
}
} catch( Exception ex ) {
ErrorHandler.LogError( "saving map", ex );
MakeDescWidget( "&cError while trying to save map" );
return;
}
game.SetNewScreen( new PauseScreen( game ) );
}
void MakeDescWidget( string text ) {
DisposeDescWidget();
descWidget = TextWidget.Create( game, 0, 90, text, Anchor.Centre, Anchor.Centre, regularFont );
}
void DisposeDescWidget() {
if( descWidget != null ) {
descWidget.Dispose();
descWidget = null;
}
}
}
}