/* * Copyright (c) 2022 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora; using Aurora.Api; using Aurora.View; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace AuroraUIComponent.UserControls { public class UCSetAllButtonsViewModel : NotifyPropertyChangedBase { public ICommand CMD_SetAll { get; set; } public ICommand DelegateSetAllCommand { get; set; } //private GridLength _SetButtonHeight = new GridLength(40); //public GridLength SetButtonHeight { get => _SetButtonHeight; set => SetProperty(ref _SetButtonHeight, value); } public class EditItem : NotifyPropertyChangedBase { public string Key { get => _Key; set => SetProperty(ref _Key, value); } private string _Key; public string Label { get => _Label; set => SetProperty(ref _Label, value); } private string _Label; public string LabelToken { get => _LabelToken; set => SetProperty(ref _LabelToken, value); } private string _LabelToken; public object DefaultValue { get { if (ValueType == typeof(double)) { return DoubleValue; } else if (ValueType == typeof(int)) { return IntValue; } else if (ValueType == typeof(string)) { return StringValue; } else if (ValueType == typeof(bool)) { return BoolValue; } return null; } set { if (ValueType == typeof(double)) { DoubleValue = (double)value; } else if (ValueType == typeof(int)) { IntValue = (int)value; } else if (ValueType == typeof(string)) { StringValue = (string)value; } else if (ValueType == typeof(bool)) { BoolValue = (bool)value; } } } public Type ValueType { get => _ValueType; set => SetProperty(ref _ValueType, value); } private Type _ValueType; public bool IsHidden { get => _IsHidden; set => SetProperty(ref _IsHidden, value); } private bool _IsHidden = false; public string StringValue { get => _StringValue; set { if (SetProperty(ref _StringValue, value)) { NotifyPropertyChanged("DefaultValue"); } } } private string _StringValue = ""; public bool BoolValue { get => _BoolValue; set { if (SetProperty(ref _BoolValue, value)) { NotifyPropertyChanged("DefaultValue"); } } } private bool _BoolValue = false; public int IntValue { get => _IntValue; set { if (SetProperty(ref _IntValue, value)) { NotifyPropertyChanged("NumberValue"); NotifyPropertyChanged("DefaultValue"); } } } private int _IntValue = 0; public double DoubleValue { get => _DoubleValue; set { if (SetProperty(ref _DoubleValue, value)) { NotifyPropertyChanged("NumberValue"); NotifyPropertyChanged("DefaultValue"); } } } private double _DoubleValue = 0.0; public double NumberValue { get { return ValueType == typeof(double) ? DoubleValue : IntValue; } set { if (ValueType == typeof(double)) { DoubleValue = (double)value; } else if (ValueType == typeof(int)) { IntValue = (int)value; } } } public EditItem(string label, string key, bool isHidden, Type valueType) { Label = label; Key = key; IsHidden = isHidden; ValueType = valueType; NotifyPropertyChanged("DefaultValue"); UpdateToken(); } public EditItem(string key, bool isHidden, Type valueType) : this(key, key, isHidden, valueType) { } public void UpdateToken() { var labelToken = Application.Current.FindStrToken(Label); LabelToken = labelToken == null ? Label : labelToken; } } public UCSetAllButtonsViewModel() { CMD_SetAll = new DelegateCommand(SetAllItem); Application.Current.AuroraEnv().EventObservable.AsObservable(AuroraSysEvent.SYS_LANGUAGE_CHANGED).Subscribe(_ => UpdateTokens()); } private void UpdateTokens() { foreach (var item in ItemList) { item.UpdateToken(); } } public bool IsSupportedType(Type valueType) { if (valueType == typeof(double)) { return true; } else if (valueType == typeof(int)) { return true; } else if (valueType == typeof(string)) { return true; } else if (valueType == typeof(bool)) { return true; } return false; } public bool AddItem(string key, Type valueType) { return AddItem(key, key, false, valueType); } public bool AddItem(string label, string key, bool isHidden, Type valueType) { if (ItemList.Count(x => x.Key == key) > 0) return false; if (IsSupportedType(valueType)) { ItemList.Add(new EditItem(label, key, isHidden, valueType)); } return true; } private void SetAllItem(object obj) { //if (obj is string strKey) { // var findItem = ItemList.FirstOrDefault(x => x.Key == strKey); // if (findItem != null) { // if (DelegateSetAllCommand != null) { // DelegateSetAllCommand.Execute(findItem); // } // } //} if (DelegateSetAllCommand != null) { DelegateSetAllCommand.Execute(obj as EditItem); } } public IList ItemList { get => _ItemList; set => SetProperty(ref _ItemList, value); } private IList _ItemList = new ObservableCollection(); } public class UCSetAllButtonsTemplate : NotifyPropertyChangedBase { private UCSetAllButtonsViewModel _SetAllDataVM; public UCSetAllButtonsViewModel SetAllDataVM { get => _SetAllDataVM; set => SetProperty(ref _SetAllDataVM, value); } private List<(string label, string key, bool isHidden)> _ShowPropertyList; public List<(string label, string key, bool isHidden)> ShowPropertyList { get => _ShowPropertyList; set => SetProperty(ref _ShowPropertyList, value); } private IList _DataList; public IList DataList { get => _DataList; set => SetProperty(ref _DataList, value); } public UCSetAllButtonsTemplate(IList dataList, List<(string label, string key, bool isHidden)> propList) { DataList = dataList; bool addAll = !(propList?.Count > 0); if (addAll) { AddAllProperties(); } else { ShowPropertyList = propList; } SetAllDataVM = new UCSetAllButtonsViewModel(); var properties = typeof(T).GetProperties(); foreach (var item in ShowPropertyList) { var prop = properties.FirstOrDefault(x => x.Name == item.key); if (prop != null) { SetAllDataVM.AddItem(item.label, item.key, item.isHidden, prop.PropertyType); } } SetAllDataVM.DelegateSetAllCommand = new DelegateCommand(ProcessSetAllData); } public void UpdateRecipe(IList dataList) { DataList = dataList; } private void AddAllProperties() { ShowPropertyList = new List<(string label, string key, bool isHidden)>(); foreach (PropertyInfo property in typeof(T).GetProperties()) { ShowPropertyList.Add((property.Name, property.Name, false)); } } public void CopyDefaultSetting(T recipe) { foreach (var item in SetAllDataVM.ItemList) { foreach (var propertyInfo in typeof(T).GetProperties()) { if (item.Key == propertyInfo.Name) { item.DefaultValue = propertyInfo.GetValue(recipe); } } } } private void CopyProperty(string key, object value) { foreach (var item in DataList) { PropertyInfo propertyInfo = typeof(T).GetProperty(key); if (propertyInfo != null) { propertyInfo.SetValue(item, value); } } } private void ProcessSetAllData(object obj) { if (obj is UCSetAllButtonsViewModel.EditItem editItem) { if (editItem.ValueType == typeof(double)) { CopyProperty(editItem.Key, editItem.DoubleValue); } else if (editItem.ValueType == typeof(int)) { CopyProperty(editItem.Key, editItem.IntValue); } else if (editItem.ValueType == typeof(string)) { CopyProperty(editItem.Key, editItem.StringValue); } else if (editItem.ValueType == typeof(bool)) { CopyProperty(editItem.Key, editItem.BoolValue); } } } } }