diff --git a/FluentTerminal.App/App.xaml.cs b/FluentTerminal.App/App.xaml.cs index d581358..77141d2 100644 --- a/FluentTerminal.App/App.xaml.cs +++ b/FluentTerminal.App/App.xaml.cs @@ -35,7 +35,7 @@ namespace FluentTerminal.App Instance = this; var builder = new ContainerBuilder(); - builder.RegisterType().As().InstancePerDependency(); + builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().InstancePerDependency(); diff --git a/FluentTerminal.App/Services/ISettingsService.cs b/FluentTerminal.App/Services/ISettingsService.cs index 44f32bb..3e382ff 100644 --- a/FluentTerminal.App/Services/ISettingsService.cs +++ b/FluentTerminal.App/Services/ISettingsService.cs @@ -6,6 +6,8 @@ namespace FluentTerminal.App.Services { public interface ISettingsService { + event EventHandler CurrentThemeChanged; + ShellConfiguration GetShellConfiguration(); void SaveShellConfiguration(ShellConfiguration spawnConfiguration); diff --git a/FluentTerminal.App/Services/Implementation/SettingsService.cs b/FluentTerminal.App/Services/Implementation/SettingsService.cs index d9afa34..8bbeac8 100644 --- a/FluentTerminal.App/Services/Implementation/SettingsService.cs +++ b/FluentTerminal.App/Services/Implementation/SettingsService.cs @@ -15,6 +15,8 @@ namespace FluentTerminal.App.Services.Implementation private ApplicationDataContainer _themes; private ApplicationDataContainer _roamingSettings; + public event EventHandler CurrentThemeChanged; + public SettingsService(IDefaultValueProvider defaultValueProvider) { _defaultValueProvider = defaultValueProvider; @@ -64,11 +66,18 @@ namespace FluentTerminal.App.Services.Implementation public void SaveCurrentThemeId(Guid id) { _roamingSettings.Values["CurrentTheme"] = id; + + CurrentThemeChanged?.Invoke(this, EventArgs.Empty); } public void SaveTheme(TerminalTheme theme) { _themes.WriteValueAsJson(theme.Id.ToString(), theme); + + if (theme.Id == GetCurrentThemeId()) + { + CurrentThemeChanged?.Invoke(this, EventArgs.Empty); + } } public void DeleteTheme(Guid id) diff --git a/FluentTerminal.App/ViewModels/MainViewModel.cs b/FluentTerminal.App/ViewModels/MainViewModel.cs index 4141761..fc7087c 100644 --- a/FluentTerminal.App/ViewModels/MainViewModel.cs +++ b/FluentTerminal.App/ViewModels/MainViewModel.cs @@ -1,33 +1,45 @@ using FluentTerminal.App.Services; using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; +using System; using System.Collections.ObjectModel; using System.Threading.Tasks; +using Windows.ApplicationModel.Core; +using Windows.UI.Core; namespace FluentTerminal.App.ViewModels { public class MainViewModel : ViewModelBase { + private const string FallbackTitle = "Fluent Terminal"; private readonly ISettingsService _settingsService; private readonly ITerminalService _terminalService; - private TerminalViewModel _selectedTerminal; - private const string FallbackTitle = "Fluent Terminal"; - private string _title; private string _background; + private CoreDispatcher _dispatcher; + private TerminalViewModel _selectedTerminal; + private string _title; public MainViewModel(ISettingsService settingsService, ITerminalService terminalService) { _settingsService = settingsService; + _settingsService.CurrentThemeChanged += OnCurrentThemeChanged; _terminalService = terminalService; Title = FallbackTitle; Background = _settingsService.GetCurrentThemeColors().Background; AddTerminalCommand = new RelayCommand(() => AddTerminal(null)); ShowSettingsCommand = new RelayCommand(async () => await ShowSettings()); + + _dispatcher = CoreApplication.GetCurrentView().Dispatcher; } public RelayCommand AddTerminalCommand { get; } - public RelayCommand ShowSettingsCommand { get; } + + public string Background + { + get => _background; + set => Set(ref _background, value); + } public TerminalViewModel SelectedTerminal { @@ -35,6 +47,8 @@ namespace FluentTerminal.App.ViewModels set => Set(ref _selectedTerminal, value); } + public RelayCommand ShowSettingsCommand { get; } + public ObservableCollection Terminals { get; } = new ObservableCollection(); public string Title @@ -43,12 +57,6 @@ namespace FluentTerminal.App.ViewModels set => Set(ref _title, value); } - public string Background - { - get => _background; - set => Set(ref _background, value); - } - public void AddTerminal(string startupDirectory) { var terminal = new TerminalViewModel(_settingsService, _terminalService, startupDirectory); @@ -71,6 +79,14 @@ namespace FluentTerminal.App.ViewModels SelectedTerminal = terminal; } + private async void OnCurrentThemeChanged(object sender, System.EventArgs e) + { + await _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => + { + Background = _settingsService.GetCurrentThemeColors().Background; + }); + } + private Task ShowSettings() { return App.Instance.ShowSettings(); diff --git a/FluentTerminal.App/ViewModels/TerminalViewModel.cs b/FluentTerminal.App/ViewModels/TerminalViewModel.cs index 47ab639..5f9bbe5 100644 --- a/FluentTerminal.App/ViewModels/TerminalViewModel.cs +++ b/FluentTerminal.App/ViewModels/TerminalViewModel.cs @@ -4,6 +4,8 @@ using FluentTerminal.Models; using GalaSoft.MvvmLight; using System; using System.Threading.Tasks; +using Windows.ApplicationModel.Core; +using Windows.UI.Core; using Windows.UI.Popups; using Windows.UI.Xaml; @@ -11,24 +13,38 @@ namespace FluentTerminal.App.ViewModels { public class TerminalViewModel : ViewModelBase { - private ITerminalView _terminalView; - private string _title; - private string _resizeOverlayContent; - private bool _showResizeOverlay; - private DispatcherTimer _resizeOverlayTimer; private readonly ISettingsService _settingsService; private readonly ITerminalService _terminalService; - private int _terminalId; + private CoreDispatcher _dispatcher; + private string _resizeOverlayContent; + private DispatcherTimer _resizeOverlayTimer; + private bool _showResizeOverlay; private string _startupDirectory; + private int _terminalId; + private ITerminalView _terminalView; + private string _title; + + public TerminalViewModel(ISettingsService settingsService, ITerminalService terminalService, string startupDirectory) + { + _settingsService = settingsService; + _settingsService.CurrentThemeChanged += OnCurrentThemeChanged; + _terminalService = terminalService; + _startupDirectory = startupDirectory; + _resizeOverlayTimer = new DispatcherTimer(); + _resizeOverlayTimer.Interval = new TimeSpan(0, 0, 2); + _resizeOverlayTimer.Tick += OnResizeOverlayTimerFinished; + + _dispatcher = CoreApplication.GetCurrentView().Dispatcher; + } public int Id { get; private set; } public bool Initialized { get; private set; } - public string Title + public string ResizeOverlayContent { - get => _title; - set => Set(ref _title, value); + get => _resizeOverlayContent; + set => Set(ref _resizeOverlayContent, value); } public bool ShowResizeOverlay @@ -48,26 +64,10 @@ namespace FluentTerminal.App.ViewModels } } - public string ResizeOverlayContent + public string Title { - get => _resizeOverlayContent; - set => Set(ref _resizeOverlayContent, value); - } - - public TerminalViewModel(ISettingsService settingsService, ITerminalService terminalService, string startupDirectory) - { - _settingsService = settingsService; - _terminalService = terminalService; - _startupDirectory = startupDirectory; - _resizeOverlayTimer = new DispatcherTimer(); - _resizeOverlayTimer.Interval = new TimeSpan(0, 0, 2); - _resizeOverlayTimer.Tick += OnResizeOverlayTimerFinished; - } - - private void OnResizeOverlayTimerFinished(object sender, object e) - { - _resizeOverlayTimer.Stop(); - ShowResizeOverlay = false; + get => _title; + set => Set(ref _title, value); } public async Task OnViewIsReady(ITerminalView terminalView) @@ -102,9 +102,19 @@ namespace FluentTerminal.App.ViewModels } } - private void OnTerminalTitleChanged(object sender, string e) + private async void OnCurrentThemeChanged(object sender, EventArgs e) { - Title = e; + await _dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => + { + var currentColors = _settingsService.GetCurrentThemeColors(); + await _terminalView.ChangeTheme(currentColors); + }); + } + + private void OnResizeOverlayTimerFinished(object sender, object e) + { + _resizeOverlayTimer.Stop(); + ShowResizeOverlay = false; } private async void OnTerminalSizeChanged(object sender, TerminalSize e) @@ -117,5 +127,10 @@ namespace FluentTerminal.App.ViewModels ShowResizeOverlay = true; await _terminalService.ResizeTerminal(_terminalId, e); } + + private void OnTerminalTitleChanged(object sender, string e) + { + Title = e; + } } -} +} \ No newline at end of file diff --git a/FluentTerminal.App/Views/ITerminalView.cs b/FluentTerminal.App/Views/ITerminalView.cs index cfbf733..d4f3fd3 100644 --- a/FluentTerminal.App/Views/ITerminalView.cs +++ b/FluentTerminal.App/Views/ITerminalView.cs @@ -9,6 +9,7 @@ namespace FluentTerminal.App.Views event EventHandler TerminalSizeChanged; event EventHandler TerminalTitleChanged; + Task ChangeTheme(TerminalColors theme); Task CreateTerminal(TerminalColors theme); Task ConnectToSocket(string url); } diff --git a/FluentTerminal.App/Views/SettingsPages/ThemeSettings.xaml b/FluentTerminal.App/Views/SettingsPages/ThemeSettings.xaml index a28970a..b8d2fea 100644 --- a/FluentTerminal.App/Views/SettingsPages/ThemeSettings.xaml +++ b/FluentTerminal.App/Views/SettingsPages/ThemeSettings.xaml @@ -88,7 +88,6 @@ Command="{x:Bind ViewModel.SelectedTheme.SaveChangesCommand, Mode=OneWay}" Foreground="White" Icon="Save" - IsEnabled="{x:Bind ViewModel.SelectedTheme.IsActive, Mode=OneWay, Converter={StaticResource NegateConverter}}" Label="Save" Style="{StaticResource ThemeAppBarButtonStyle}" /> TerminalTitleChanged?.Invoke(this, title)); } + + public Task ChangeTheme(TerminalColors theme) + { + var serialized = JsonConvert.SerializeObject(theme, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + return ExecuteScriptAsync($"changeTheme('{serialized}')"); + } } } diff --git a/FluentTerminal.Client/dist/bundle.js b/FluentTerminal.Client/dist/bundle.js index 4b72169..0877b50 100644 --- a/FluentTerminal.Client/dist/bundle.js +++ b/FluentTerminal.Client/dist/bundle.js @@ -143,8 +143,16 @@ function connectToWebSocket(url) { socket.onopen = attachTerminal; } +function changeTheme(theme) { + theme = JSON.parse(theme); + theme.background = 'transparent'; + + term.setOption('theme', theme); +} + window.createTerminal = createTerminal; window.connectToWebSocket = connectToWebSocket; +window.changeTheme = changeTheme; /***/ }), /* 1 */ diff --git a/FluentTerminal.Client/src/index.js b/FluentTerminal.Client/src/index.js index 4e7ca52..f858d66 100644 --- a/FluentTerminal.Client/src/index.js +++ b/FluentTerminal.Client/src/index.js @@ -64,5 +64,13 @@ function connectToWebSocket(url) { socket.onopen = attachTerminal; } +function changeTheme(theme) { + theme = JSON.parse(theme); + theme.background = 'transparent'; + + term.setOption('theme', theme); +} + window.createTerminal = createTerminal; -window.connectToWebSocket = connectToWebSocket; \ No newline at end of file +window.connectToWebSocket = connectToWebSocket; +window.changeTheme = changeTheme; \ No newline at end of file