Files

265 lines
8.4 KiB
C#
Raw Permalink Normal View History

using MainShell.Common;
using MainShell.Models;
using MainShell.Recipe.Models;
using MaxwellFramework.Core.Interfaces;
using MwFramework.ManagerService;
using Stylet;
using StyletIoC;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MainShell.Recipe.ViewModel
{
public class RecipeViewModel :BaseScreen ,IPage
{
private bool _isReactivatingAfterBlockedLeave;
public string Name => "Recipe";
private const string CARRIER = "载具配方";
private const string SUBSTRATE = "基板配方";
private const string WAFER = "芯片配方";
private const string PROCESS = "工艺配方";
private readonly Dictionary<string, BaseScreen> _viewModelDict = new Dictionary<string, BaseScreen>();
public ObservableCollection<MenuItemWrap> MenuItemWraps { get; private set; }
private MenuItemWrap _selectedMenuItem;
public MenuItemWrap SelectedMenuItem
{
get { return _selectedMenuItem; }
set
{
if (_selectedMenuItem == value)
return;
if (_selectedMenuItem != null && value != null && !TryLeaveCurrentScreen())
{
NotifyOfPropertyChange(() => SelectedMenuItem);
return;
}
if (SetAndNotify(ref _selectedMenuItem, value))
{
CurrentScreen = value != null ? _viewModelDict[value.Header] : null;
SyncCurrentScreenSelectionFromActiveRecipe();
}
}
}
private BaseScreen _currentScreen;
public BaseScreen CurrentScreen
{
get { return _currentScreen; }
set
{
if (_currentScreen == value)
return;
UnsubscribeScreenState(_currentScreen as INotifyPropertyChanged);
if (SetAndNotify(ref _currentScreen, value))
{
SubscribeScreenState(value as INotifyPropertyChanged);
NotifyOfPropertyChange(() => IsRecipePanelHidden);
}
}
}
public bool IsRecipePanelHidden
{
get
{
var recipeScreen = CurrentScreen as IRecipeViewModel;
return recipeScreen != null && recipeScreen.HideRecipePanel;
}
set
{
var recipeScreen = CurrentScreen as IRecipeViewModel;
if (recipeScreen == null || recipeScreen.HideRecipePanel == value)
return;
recipeScreen.HideRecipePanel = value;
NotifyOfPropertyChange(() => IsRecipePanelHidden);
}
}
private CarrierRecipeViewModel _carrierRecipeViewModel;
[Inject]
public CarrierRecipeViewModel CarrierRecipeViewModel
{
get { return _carrierRecipeViewModel; }
set { _carrierRecipeViewModel = value; }
}
private SubstrateRecipeViewModel _substrateRecipeViewModel;
[Inject]
public SubstrateRecipeViewModel SubstrateRecipeViewModel
{
get { return _substrateRecipeViewModel; }
set { _substrateRecipeViewModel = value; }
}
private WaferRecipeViewModel _waferRecipeViewModel;
[Inject]
public WaferRecipeViewModel WaferRecipeViewModel
{
get { return _waferRecipeViewModel; }
set { _waferRecipeViewModel = value; }
}
private ProcessRecipeViewModel _processRecipeViewModel;
[Inject]
public ProcessRecipeViewModel ProcessRecipeViewModel
{
get { return _processRecipeViewModel; }
set { _processRecipeViewModel = value; }
}
public RecipeViewModel()
{
InitMenuItems();
}
protected override void OnViewLoaded()
{
base.OnViewLoaded();
EnsureViewModelDict();
if(SelectedMenuItem==null)
SelectedMenuItem = MenuItemWraps[0];
SyncCurrentScreenSelectionFromActiveRecipe();
}
private void InitMenuItems()
{
MenuItemWraps = new ObservableCollection<MenuItemWrap>
{
//new MenuItemWrap() { Header=CARRIER,Tag=CARRIER },
new MenuItemWrap() { Header=SUBSTRATE,Tag=SUBSTRATE },
new MenuItemWrap() { Header=WAFER,Tag=WAFER },
new MenuItemWrap() { Header=PROCESS,Tag=PROCESS },
};
}
private void InitViewModelDict()
{
_viewModelDict.Clear();
_viewModelDict.Add(CARRIER, CarrierRecipeViewModel);
_viewModelDict.Add(SUBSTRATE, SubstrateRecipeViewModel);
_viewModelDict.Add(WAFER, WaferRecipeViewModel);
_viewModelDict.Add(PROCESS, ProcessRecipeViewModel);
}
private void EnsureViewModelDict()
{
if (_viewModelDict.Count == 0)
{
InitViewModelDict();
}
}
private void SyncCurrentScreenSelectionFromActiveRecipe()
{
var recipeScreen = CurrentScreen as IRecipeViewModel;
recipeScreen?.SyncSelectionFromActiveRecipe();
}
private bool TryLeaveCurrentScreen()
{
var guard = CurrentScreen as IRecipeViewModel;
if (guard == null)
return true;
return guard.TryLeaveCurrentRecipeContext();
}
public bool TrySelectMenuItem(MenuItemWrap targetMenuItem)
{
if (targetMenuItem == null)
return false;
SelectedMenuItem = targetMenuItem;
return SelectedMenuItem == targetMenuItem;
}
public bool TrySelectRecipeWrap(RecipeWrap targetRecipeWrap)
{
var guard = CurrentScreen as IRecipeViewModel;
if (guard == null || targetRecipeWrap == null)
return false;
if (guard.SelectedRecipeWrap == targetRecipeWrap)
return true;
guard.SelectedRecipeWrap = targetRecipeWrap;
return guard.SelectedRecipeWrap == targetRecipeWrap;
}
private void SubscribeScreenState(INotifyPropertyChanged screen)
{
if (screen != null)
{
screen.PropertyChanged += OnCurrentScreenPropertyChanged;
}
}
private void UnsubscribeScreenState(INotifyPropertyChanged screen)
{
if (screen != null)
{
screen.PropertyChanged -= OnCurrentScreenPropertyChanged;
}
}
private void OnCurrentScreenPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (string.IsNullOrWhiteSpace(e.PropertyName) || string.Equals(e.PropertyName, nameof(BaseScreen.HideRecipePanel), StringComparison.Ordinal))
{
NotifyOfPropertyChange(() => IsRecipePanelHidden);
}
}
protected override void OnStateChanged(ScreenState previousState, ScreenState newState)
{
base.OnStateChanged(previousState, newState);
if (_isReactivatingAfterBlockedLeave)
return;
if (newState == ScreenState.Active)
{
EnsureViewModelDict();
if (SelectedMenuItem == null && MenuItemWraps != null && MenuItemWraps.Count > 0)
{
SelectedMenuItem = MenuItemWraps[0];
}
SyncCurrentScreenSelectionFromActiveRecipe();
}
if (previousState == ScreenState.Active && newState == ScreenState.Deactivated && !TryLeaveCurrentScreen())
{
try
{
_isReactivatingAfterBlockedLeave = true;
Execute.OnUIThread(() => ((IScreenState)this).Activate());
}
finally
{
_isReactivatingAfterBlockedLeave = false;
}
}
}
protected override void OnDeactivate()
{
UnsubscribeScreenState(_currentScreen as INotifyPropertyChanged);
base.OnDeactivate();
}
}
}