Files
FluentTerminal/FluentTerminal.App/ViewModels/TerminalViewModel.cs
T
2018-01-31 21:18:13 +01:00

105 lines
3.1 KiB
C#

using FluentTerminal.App.Models;
using FluentTerminal.App.Views;
using GalaSoft.MvvmLight;
using System;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.Web.Http;
namespace FluentTerminal.App.ViewModels
{
public class TerminalViewModel : ViewModelBase
{
private static HttpClient _httpClient;
private ITerminalView _terminalView;
private string _title;
private string _resizeOverlayContent;
private bool _showResizeOverlay;
private DispatcherTimer _resizeOverlayTimer;
public int Id { get; private set; }
public bool Initialized { get; private set; }
public string Title
{
get => _title;
set => Set(ref _title, value);
}
public bool ShowResizeOverlay
{
get => _showResizeOverlay;
set
{
if (!Initialized)
{
return;
}
Set(ref _showResizeOverlay, value);
if (value)
{
if (_resizeOverlayTimer.IsEnabled)
{
_resizeOverlayTimer.Stop();
}
_resizeOverlayTimer.Start();
}
}
}
public string ResizeOverlayContent
{
get => _resizeOverlayContent;
set => Set(ref _resizeOverlayContent, value);
}
public TerminalViewModel()
{
_resizeOverlayTimer = new DispatcherTimer();
_resizeOverlayTimer.Interval = new TimeSpan(0, 0, 2);
_resizeOverlayTimer.Tick += OnResizeOverlayTimerFinished;
}
private void OnResizeOverlayTimerFinished(object sender, object e)
{
_resizeOverlayTimer.Stop();
ShowResizeOverlay = false;
}
static TerminalViewModel()
{
_httpClient = new HttpClient();
}
public async Task OnViewIsReady(ITerminalView terminalView)
{
_terminalView = terminalView;
_terminalView.TerminalSizeChanged += OnTerminalSizeChanged;
_terminalView.TerminalTitleChanged += OnTerminalTitleChanged;
var size = await _terminalView.CreateTerminal(null);
var response = await _httpClient.PostAsync(new Uri($"http://localhost:9000/terminals?cols={size.Columns}&rows={size.Rows}"), null);
var url = await response.Content.ReadAsStringAsync();
Id = int.Parse(url.Split(":")[2].Trim('"'));
await _terminalView.ConnectToSocket(url);
Initialized = true;
}
private void OnTerminalTitleChanged(object sender, string e)
{
Title = e;
}
private async void OnTerminalSizeChanged(object sender, TerminalSize e)
{
ResizeOverlayContent = $"{e.Columns} x {e.Rows}";
ShowResizeOverlay = true;
await _httpClient.PostAsync(new Uri($"http://localhost:9000/terminals/{Id}/size?cols={e.Columns}&rows={e.Rows}"), null);
}
}
}