city-generation/Tools/MapViewer/MapViewer/MainWindow.xaml.cs

203 lines
5.0 KiB
C#

using System;
using System.ComponentModel;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
using Microsoft.Win32;
using TransportGame.MapViewer.Storage;
using TransportGame.Model;
namespace TransportGame.MapViewer
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
#region Map property
private Map _map;
public Map Map
{
get
{
return _map;
}
private set
{
_map = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Map"));
}
}
#endregion
#region Loaded file property
private string _loadedFile;
public string LoadedFile
{
get
{
return _loadedFile;
}
private set
{
_loadedFile = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("LoadedFile"));
}
}
#endregion
#region Rendered map property
private BitmapSource _renderedMap;
public BitmapSource RenderedMap
{
get
{
return _renderedMap;
}
private set
{
_renderedMap = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("RenderedMap"));
}
}
#endregion
public MapRenderer Renderer { get; private set; }
public MainWindow()
{
InitializeComponent();
Renderer = new MapRenderer();
LoadedFile = "N/A";
DataContext = this;
}
private async Task OpenMapFile(string filename)
{
await LoadMap(filename);
await RenderMap();
}
private static bool ShowOpenMapDialog(out string filename)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Map files|*.map|All files|*.*";
dialog.Title = "Open map file";
bool? result = dialog.ShowDialog();
if (!result.HasValue || !result.Value)
{
filename = null;
return false;
}
filename = dialog.FileName;
return true;
}
private static bool ShowSaveMapDialog(out string filename)
{
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "PNG Files|*.png|All files|*.*";
dialog.Title = "Save rendered map image";
bool? result = dialog.ShowDialog();
if (!result.HasValue || !result.Value)
{
filename = null;
return false;
}
filename = dialog.FileName;
return true;
}
private async Task LoadMap(string filename)
{
progress.Visibility = System.Windows.Visibility.Visible;
progressText.Text = "Loading map...";
try
{
Map = await Task.Run(() => MapStorage.Read(filename));
LoadedFile = filename;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error");
}
progress.Visibility = System.Windows.Visibility.Hidden;
}
private async Task RenderMap()
{
progress.Visibility = System.Windows.Visibility.Visible;
progressText.Text = "Rendering map...";
try
{
RenderedMap = await Renderer.RenderToImageSource(Map);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error");
}
progress.Visibility = System.Windows.Visibility.Hidden;
}
private async void buttonOpen_Click(object sender, RoutedEventArgs e)
{
// Open dialog
string filename;
if (!ShowOpenMapDialog(out filename))
return;
// Load file and generate image
await OpenMapFile(filename);
}
private void buttonSave_Click(object sender, RoutedEventArgs e)
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(RenderedMap));
using (var writer = File.OpenWrite(LoadedFile + ".png"))
{
encoder.Save(writer);
writer.Close();
}
}
private async void zoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (Map != null)
await RenderMap();
}
}
}