/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using System; using System.Windows; using System.ComponentModel; using System.Windows.Threading; using VisionCommon; namespace VisionUI.Camera { /// /// 메인 카메라 뷰 윈도우 /// MainCameraViewWindow.xaml BehindCode /// public partial class MainCameraViewWindow : Window { private static Logger _Logger = new Logger("MainCameraViewWindow"); private IDisposable _EventDisposable; /// Static 객체(싱글톤) public static MainCameraViewWindow _Instance = null; private static readonly object _Lock = new object(); private bool _IsViewInitialized = false; private eDisplayType _displayType = eDisplayType.Main_1; private delegate void HideWindow(); /// /// 싱글톤 객체 /// public static MainCameraViewWindow Instance { get { lock (_Lock) { if (_Instance == null) { _Instance = new MainCameraViewWindow(); } return _Instance; } } } /// /// 생성자 /// public MainCameraViewWindow() { _Instance = this; InitializeComponent(); CreateView(); SetObservable(); } private void SetObservable() { if (_EventDisposable == null) { var observable = VisionEventId.GetRecipeActivatedObservable(); _EventDisposable = observable.Subscribe(_ => UpdateView()); } } private void UpdateView() { Application.Current.Dispatcher.BeginInvoke((Action)(() => { var camWindow = MainCameraViewManager.Instance.GetMainCameraView(_displayType); // 지속적인 메모리 증가로 인하여 방어코드 생성 - from.MagnetAttch 과제 if (!gridMainCameraViewWindow.Children.Contains(camWindow)) { MainCameraViewManager.Instance.DisposeMainCameraView(_displayType); gridMainCameraViewWindow.Children.Clear(); gridMainCameraViewWindow.Children.Add(camWindow); } })); } /// /// 카메라 뷰 생성 /// CameraView를 미리 만들어 놓기 위해 프로그램 로딩시 수행 /// public void CreateView() { Application.Current.Dispatcher.BeginInvoke((Action)(() => { if (!_IsViewInitialized) { gridMainCameraViewWindow.Children.Add(MainCameraViewManager.Instance.GetMainCameraView(_displayType)); _IsViewInitialized = true; } })); } protected override void OnClosing(CancelEventArgs e) { // Aurora 앱이 닫힌 후에도 해당 팝업이 강제종료될때까지 살아있어, 명시적으로 꺼질 수 있게끔 예외처리코드 추가 if (Application.Current.MainWindow != null) { e.Cancel = true; Dispatcher.BeginInvoke(DispatcherPriority.Normal, new HideWindow(_HideWindow)); } } private void _HideWindow() { CameraUcManager.Instance.StopLiveAll(); this.Hide(); } } }