352 lines
10 KiB
C#
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
|
|
}
|