using System.IO; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using Azaion.Common.Database; using Azaion.Common.DTO; using Azaion.Common.DTO.Config; using Azaion.Common.Services; using Azaion.Common.Services.Inference; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using SharpVectors.Converters; namespace Azaion.Suite; public partial class MainSuite { private readonly AppConfig _appConfig; private readonly IConfigUpdater _configUpdater; private readonly IEnumerable _modules; private readonly IServiceProvider _sp; private readonly IGalleryService _galleryService; private readonly IDbFactory _dbFactory; private readonly Dictionary _openedWindows = new(); private readonly IInferenceClient _inferenceClient; private readonly IGpsMatcherClient _gpsMatcherClient; public MainSuite(IOptions appConfig, IConfigUpdater configUpdater, IEnumerable modules, IServiceProvider sp, IGalleryService galleryService, IDbFactory dbFactory, IInferenceClient inferenceClient, IGpsMatcherClient gpsMatcherClient) { _configUpdater = configUpdater; _modules = modules; _sp = sp; _galleryService = galleryService; _dbFactory = dbFactory; _inferenceClient = inferenceClient; _gpsMatcherClient = gpsMatcherClient; _appConfig = appConfig.Value; InitializeComponent(); Loaded += OnLoaded; Closed += OnFormClosed; Left = (SystemParameters.WorkArea.Width - Width) / 2; } private void OnLoaded(object sender, RoutedEventArgs e) { if (!Directory.Exists(_appConfig.DirectoriesConfig.LabelsDirectory)) Directory.CreateDirectory(_appConfig.DirectoriesConfig.LabelsDirectory); if (!Directory.Exists(_appConfig.DirectoriesConfig.ImagesDirectory)) Directory.CreateDirectory(_appConfig.DirectoriesConfig.ImagesDirectory); if (!Directory.Exists(_appConfig.DirectoriesConfig.ResultsDirectory)) Directory.CreateDirectory(_appConfig.DirectoriesConfig.ResultsDirectory); foreach (var azaionModule in _modules) { var lvItem = new ListViewItem { Content = new StackPanel { Children = { new SvgViewbox { SvgSource = azaionModule.SvgIcon, Width = 24, Height = 24, Margin = new Thickness(0, 0, 10, 0) }, new TextBlock { Text = azaionModule.Name, Foreground = Brushes.White, HorizontalAlignment = HorizontalAlignment.Center, Background = Brushes.Black } } }, Background = Brushes.Black, Foreground = Brushes.White, Cursor = Cursors.Hand, Tag = azaionModule }; lvItem.MouseUp += (lv, _) => OpenWindow((lv as ListViewItem)!); ListView.Items.Add(lvItem); _ = _sp.GetRequiredService(azaionModule.MainWindowType) as Window; } _ = Task.Run(async () => await _galleryService.RefreshThumbnails()); //by default show first ListView.SelectedIndex = 0; OpenWindow((ListView.Items[0] as ListViewItem)!); } private void OpenWindow(ListViewItem sender) { var module = (sender.Tag as IAzaionModule)!; var window = (_sp.GetRequiredService(module.MainWindowType) as Window)!; if (_openedWindows.ContainsKey(module.WindowEnum)) window.Activate(); else { _openedWindows[module.WindowEnum] = window; window.Closed += (_, _) => { _openedWindows.Remove(module.WindowEnum); if (_openedWindows.Any()) return; Close(); }; window.Show(); window.Activate(); } } private void OnFormClosed(object? sender, EventArgs e) { foreach (var window in _openedWindows) window.Value.Close(); _inferenceClient.Dispose(); _gpsMatcherClient.Dispose(); Application.Current.Shutdown(); } private void CloseBtn_OnClick(object sender, RoutedEventArgs e) => Close(); private double _startMouseMovePosition; private void OnMouseMove(object sender, MouseEventArgs e) { if (e.OriginalSource is Button || e.OriginalSource is StackPanel) return; if (e.LeftButton == MouseButtonState.Pressed) Left = System.Windows.Forms.Cursor.Position.X - _startMouseMovePosition; } private void MainSuite_OnMouseDown(object sender, MouseButtonEventArgs e) { _startMouseMovePosition = e.GetPosition(this).X; } }