JD2022-TU1/main/tools/framework/JD.Timeline/Dance/MotionClipEditionHelper.xaml.cs

352 lines
10 KiB
C#

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using JD.Application.View.WindowLess;
using JD.Collections.Extensions;
using JD.ColorForms;
using JetBrains.Annotations;
using TeaBox;
using TeaBox.Gui;
using JD.Serialization;
using ComboBox = System.Windows.Controls.ComboBox;
using PropertyChangedEventArgs = System.ComponentModel.PropertyChangedEventArgs;
namespace JD.Timeline.View.Helpers
{
/// <summary>
/// Interaction logic for MotionClipEditionHelper.xaml
/// </summary>
public partial class MotionClipEditionHelper : INotifyPropertyChanged
{
#region Variables
private MoveModel _currentModel;
private MotionClip _clip;
private Tape _tape;
private bool _showWatermarkText;
private bool _isCurrentNameValid;
private ObservableCollection<object> _modelList = new ObservableCollection<object>();
private bool _showNameWarning;
#endregion
#region Constructor
public MotionClipEditionHelper()
{
Owner = System.Windows.Application.Current.MainWindow;
}
public MotionClipEditionHelper(Tape tape, MotionClip.MoveType_Enum moveType, bool isModal = true)
:
this()
{
IsModal = isModal;
Tape = tape;
MoveType = moveType;
CurrentModel = null;
Initialize();
}
public MotionClipEditionHelper(MotionClip clip, bool isModal = false)
:
this()
{
IsModal = isModal;
Tape = clip.Tape;
Clip = clip;
MoveType = clip.MoveType;
CurrentModel = clip.Model;
Initialize();
}
#endregion
#region Properties
public Tape Tape
{
get { return _tape; }
set
{
if (_tape != value)
{
_tape = value;
OnPropertyChanged("Tape");
}
}
}
public new MotionClip Clip
{
get { return _clip; }
set
{
if (_clip != value)
{
_clip = value;
OnPropertyChanged("Clip");
}
}
}
public MoveModel CurrentModel
{
get { return _currentModel; }
set
{
if (_currentModel != value)
{
_currentModel = value;
OnPropertyChanged("CurrentModel");
}
}
}
public bool IsModal { get; set; }
public MotionClip.MoveType_Enum MoveType { get; set; }
public ObservableCollection<object> ModelList
{
get { return _modelList; }
set { _modelList = value; }
}
public bool IsGoldenChecked
{
get { return Clip != null && Clip.GoldMove; }
set { if (Clip != null) Clip.GoldMove = value; }
}
public bool IsGoldenMoveEditable
{
get { return Clip != null; }
}
public bool ShowWatermarkText
{
get { return _showWatermarkText; }
set
{
if (value != _showWatermarkText)
{
_showWatermarkText = value;
OnPropertyChanged("ShowWatermarkText");
}
}
}
public bool IsCurrentNameValid
{
get { return _isCurrentNameValid; }
set
{
if (value != _isCurrentNameValid)
{
_isCurrentNameValid = value;
OnPropertyChanged("IsCurrentNameValid");
}
}
}
public bool ShowNameWarning
{
get { return _showNameWarning; }
set
{
if (value != _showNameWarning)
{
_showNameWarning = value;
OnPropertyChanged("ShowNameWarning");
}
}
}
private bool ColorDialogVisible { get; set; }
#endregion
#region Methods
private void Initialize()
{
DataContext = this;
InitializeComponent();
RefreshModelList();
}
private void RefreshModelList()
{
_modelList.Clear();
_modelList.Add(new AddNewMoveModelAction());
_modelList.AddRange(Tape.MoveModels().Where(x => x.MoveType == MoveType).AsSorted((x, y) => String.Compare(x.Name, y.Name, StringComparison.OrdinalIgnoreCase)));
_modelComboBox.SelectedItem = CurrentModel ?? _modelComboBox.Items[0];
}
private void Models_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (_modelComboBox.SelectedItem is MoveModel)
{
if (Clip != null)
{
Clip.Model = (MoveModel)_modelComboBox.SelectedItem;
}
CurrentModel = _modelComboBox.SelectedItem as MoveModel;
ShowWatermarkText = CurrentModel != null && String.IsNullOrEmpty(CurrentModel.Name);
_modelComboBox.Text = CurrentModel.Name;
}
else if (_modelComboBox.SelectedItem is AddNewMoveModelAction)
{
CurrentModel = null;
ShowWatermarkText = true;
IsCurrentNameValid = false;
_modelComboBox.Text = "";
}
SetCaretAtEndOfTextBox();
}
private void CreateNewModelButton_Click(object sender, RoutedEventArgs e)
{
_modelComboBox.SelectedItem = (sender as Button).DataContext;
_modelComboBox.IsDropDownOpen = false;
if (_modelComboBox.SelectedItem is MoveModel)
{
var moveModelToCopy = (MoveModel)_modelComboBox.SelectedItem;
var existingModels = Tape.MoveModels().Where(x => x.MoveType == MoveType).Select(x => x.Name).ToList();
var newMoveModelName = moveModelToCopy.Name.MakeUniqueName(existingModels);
CurrentModel = Tape.GetOrCreateMoveModel(newMoveModelName, MoveType);
CurrentModel.Color = moveModelToCopy.Color.Add(40);
RefreshModelList();
ShowWatermarkText = false;
IsCurrentNameValid = true;
ShowNameWarning = false;
SetCaretAtEndOfTextBox();
}
}
private void Models_TextChanged(object sender, TextChangedEventArgs e)
{
var comboBox = sender as ComboBox;
if (comboBox == null)
return;
IsCurrentNameValid = Tape.MoveModels()
.Where(x => x.MoveType == MoveType && x != CurrentModel)
.All(x => x.Name != comboBox.Text)
&& !String.IsNullOrEmpty(comboBox.Text)
&& MoveModel.IsNameValid(comboBox.Text);
if (IsCurrentNameValid && CurrentModel == null)
{
CurrentModel = Tape.GetOrCreateMoveModel(comboBox.Text, MoveType);
RefreshModelList();
}
else if (IsCurrentNameValid && CurrentModel != null)
{
CurrentModel.Name = comboBox.Text;
}
ShowWatermarkText = String.IsNullOrEmpty(comboBox.Text);
ShowNameWarning = (CurrentModel != null && !IsCurrentNameValid) || (CurrentModel == null && !String.IsNullOrEmpty(comboBox.Text) && !IsCurrentNameValid);
}
private void Window_Deactivated(object sender, EventArgs e)
{
if (!IsModal && !ColorDialogVisible)
{
Close();
}
}
private void Window_Activated(object sender, EventArgs e)
{
SetCaretAtEndOfTextBox();
}
private void OkClick(object sender, RoutedEventArgs e)
{
if (IsCurrentNameValid)
{
DialogResult = true;
}
}
private void CancelClick(object sender, RoutedEventArgs e)
{
DialogResult = false;
}
private void Color_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1 && sender is FrameworkElement)
{
var moveModel = ((FrameworkElement)sender).DataContext as MoveModel;
if (moveModel == null)
return;
ColorDialogVisible = true;
var dlg = new ColorDialog { Color = moveModel.Color };
if (dlg.ShowDialog(null) == System.Windows.Forms.DialogResult.OK)
{
moveModel.Color = dlg.Color;
}
ColorDialogVisible = false;
}
}
private void SetCaretAtEndOfTextBox()
{
var textBox = (_modelComboBox.Template.FindName("PART_EditableTextBox", _modelComboBox) as TextBox);
if (textBox != null)
{
textBox.Focus();
textBox.Select(textBox.Text.Length, 0);
}
}
#endregion
#region Events
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
#region WPF classes
public class AddNewMoveModelAction
{
public override string ToString()
{
return "";
}
}
public class MoveModelHelperTemplateSelector : DataTemplateSelector
{
public DataTemplate MoveModelDataTemplate { get; set; }
public DataTemplate CreateMoveModelDataTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is AddNewMoveModelAction)
return CreateMoveModelDataTemplate;
return MoveModelDataTemplate;
}
}
#endregion
}