203 lines
5.0 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|