mirror of
				https://github.com/ClassiCube/ClassiCube.git
				synced 2025-10-31 02:27:24 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			165 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| // ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
 | |
| using System;
 | |
| using System.Drawing;
 | |
| using System.IO;
 | |
| using ClassicalSharp.Gui.Widgets;
 | |
| using ClassicalSharp.Map;
 | |
| using OpenTK.Input;
 | |
| 
 | |
| namespace ClassicalSharp.Gui.Screens {
 | |
| 	public sealed class SaveLevelScreen : MenuScreen {
 | |
| 		
 | |
| 		public SaveLevelScreen(Game game) : base(game) {
 | |
| 		}
 | |
| 		
 | |
| 		InputWidget input;
 | |
| 		TextWidget desc;
 | |
| 		const int overwriteIndex = 2;
 | |
| 		static FastColour grey = new FastColour(150, 150, 150);
 | |
| 		
 | |
| 		public override void Render(double delta) {
 | |
| 			RenderMenuBounds();
 | |
| 			gfx.Texturing = true;
 | |
| 			RenderMenuWidgets(delta);
 | |
| 			input.Render(delta);
 | |
| 			if (desc != null) desc.Render(delta);
 | |
| 			gfx.Texturing = false;
 | |
| 			
 | |
| 			float cX = game.Width / 2, cY = game.Height / 2;
 | |
| 			gfx.Draw2DQuad(cX - 250, cY + 90, 500, 2, grey);
 | |
| 			if (textPath == null) return;
 | |
| 			SaveMap(textPath);
 | |
| 			textPath = null;
 | |
| 		}
 | |
| 		
 | |
| 		public override bool HandlesKeyPress(char key) {
 | |
| 			RemoveOverwrites();
 | |
| 			return input.HandlesKeyPress(key);
 | |
| 		}
 | |
| 		
 | |
| 		public override bool HandlesKeyDown(Key key) {
 | |
| 			RemoveOverwrites();
 | |
| 			if (key == Key.Escape) {
 | |
| 				game.Gui.SetNewScreen(null);
 | |
| 				return true;
 | |
| 			}
 | |
| 			return input.HandlesKeyDown(key);
 | |
| 		}
 | |
| 		
 | |
| 		public override bool HandlesKeyUp(Key key) {
 | |
| 			return input.HandlesKeyUp(key);
 | |
| 		}
 | |
| 		
 | |
| 		public override void Init() {
 | |
| 			game.Keyboard.KeyRepeat = true;
 | |
| 			titleFont = new Font(game.FontName, 16, FontStyle.Bold);
 | |
| 			regularFont = new Font(game.FontName, 16, FontStyle.Regular);
 | |
| 			
 | |
| 			input = MenuInputWidget.Create(game, 500, 30, "",
 | |
| 			                                     regularFont, new PathValidator())
 | |
| 				.SetLocation(Anchor.Centre, Anchor.Centre, 0, -30);
 | |
| 			input.ShowCaret = true;
 | |
| 			
 | |
| 			widgets = new Widget[] {
 | |
| 				ButtonWidget.Create(game, 301, 40, "Save", titleFont, SaveClassic)
 | |
| 					.SetLocation(Anchor.Centre, Anchor.Centre, 0, 20),
 | |
| 				ButtonWidget.Create(game, 201, 40, "Save schematic", titleFont, SaveSchematic)
 | |
| 					.SetLocation(Anchor.Centre, Anchor.Centre, -150, 120),
 | |
| 				TextWidget.Create(game, "&eCan be imported into MCEdit", regularFont)
 | |
| 					.SetLocation(Anchor.Centre, Anchor.Centre, 110, 120),
 | |
| 				null,
 | |
| 				MakeBack(false, titleFont,
 | |
| 				         (g, w) => g.Gui.SetNewScreen(new PauseScreen(g))),
 | |
| 			};
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		public override void OnResize(int width, int height) {
 | |
| 			input.CalculatePosition();
 | |
| 			base.OnResize(width, height);
 | |
| 		}
 | |
| 		
 | |
| 		public override void Dispose() {
 | |
| 			game.Keyboard.KeyRepeat = false;
 | |
| 			input.Dispose();
 | |
| 			DisposeDescWidget();
 | |
| 			base.Dispose();
 | |
| 		}
 | |
| 		
 | |
| 		void SaveClassic(Game game, Widget widget, MouseButton btn, int x, int y) {
 | |
| 			DoSave(widget, btn, ".cw");
 | |
| 		}
 | |
| 		
 | |
| 		void SaveSchematic(Game game, Widget widget, MouseButton btn, int x, int y) {
 | |
| 			DoSave(widget, btn, ".schematic");
 | |
| 		}
 | |
| 		
 | |
| 		void DoSave(Widget widget, MouseButton mouseBtn, string ext) {
 | |
| 			if (mouseBtn != MouseButton.Left) return;
 | |
| 			
 | |
| 			string text = input.Text.ToString();
 | |
| 			if (text.Length == 0) {
 | |
| 				MakeDescWidget("&ePlease enter a filename"); return;
 | |
| 			}
 | |
| 			string file = Path.ChangeExtension(text, ext);
 | |
| 			text = Path.Combine(Program.AppDirectory, "maps");
 | |
| 			text = Path.Combine(text, file);
 | |
| 			
 | |
| 			if (File.Exists(text) && widget.Metadata == null) {
 | |
| 				((ButtonWidget)widget).SetText("&cOverwrite existing?");
 | |
| 				((ButtonWidget)widget).Metadata = true;
 | |
| 			} 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;
 | |
| 				RemoveOverwrites();
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		void RemoveOverwrites() {
 | |
| 			RemoveOverwrite(widgets[0]); RemoveOverwrite(widgets[1]);
 | |
| 		}
 | |
| 		
 | |
| 		void RemoveOverwrite(Widget widget) {
 | |
| 			ButtonWidget button = (ButtonWidget)widget;
 | |
| 			if (button.Metadata == null) return;
 | |
| 			button.Metadata = null;
 | |
| 			button.SetText("Save");
 | |
| 		}
 | |
| 		
 | |
| 		string textPath;
 | |
| 		void SaveMap(string path) {
 | |
| 			bool classic = path.EndsWith(".cw");
 | |
| 			try {
 | |
| 				if (File.Exists(path))
 | |
| 					File.Delete(path);
 | |
| 				using(FileStream fs = new FileStream(path, FileMode.CreateNew, FileAccess.Write)) {
 | |
| 					IMapFormatExporter exporter = null;
 | |
| 					if (classic) exporter = new MapCwExporter();
 | |
| 					else exporter = new MapSchematicExporter();
 | |
| 					exporter.Save(fs, game);
 | |
| 				}
 | |
| 			} catch(Exception ex) {
 | |
| 				ErrorHandler.LogError("saving map", ex);
 | |
| 				MakeDescWidget("&cError while trying to save map");
 | |
| 				return;
 | |
| 			}
 | |
| 			game.Chat.Add("&eSaved map to: " + Path.GetFileName(path));
 | |
| 			game.Gui.SetNewScreen(new PauseScreen(game));
 | |
| 		}
 | |
| 		
 | |
| 		void MakeDescWidget(string text) {
 | |
| 			DisposeDescWidget();
 | |
| 			desc = TextWidget.Create(game, text, regularFont)
 | |
| 				.SetLocation(Anchor.Centre, Anchor.Centre, 0, 65);
 | |
| 		}
 | |
| 		
 | |
| 		void DisposeDescWidget() {
 | |
| 			if (desc != null) {
 | |
| 				desc.Dispose();
 | |
| 				desc = null;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| } | 
