Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions SimpleStateMachineNodeEditor/App.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Icons/Icons.xaml"/>
<ResourceDictionary Source="Styles/Themes/Dark.xaml"/>
<!--<ResourceDictionary Source="Styles/Themes/Light.xaml"/>-->
<ResourceDictionary Source="Icons/Icons.xaml"/>


<!--<ResourceDictionary Source="Styles/Theme.xaml"/>-->
<ResourceDictionary Source="Styles/ErrorList/StyleExpander.xaml"/>
<ResourceDictionary Source="Styles/ErrorList/StyleScrollBar.xaml"/>
Expand Down Expand Up @@ -46,12 +48,11 @@
<ResourceDictionary Source="Styles/MainWindow/CustomWindowTemplate.xaml"/>

<!--#region Header-->
<ResourceDictionary Source="Styles/MainWindow/ToolBar/ToolButtonTemplate.xaml"/>
<ResourceDictionary Source="Styles/MainWindow/ToolBar/ToolButtonTemplate.xaml"/>
<ResourceDictionary Source="Styles/MainWindow/ToolBar/TemplateSeparator.xaml"/>
<ResourceDictionary Source="Styles/MainWindow/ToolBarTemplate.xaml"/>
<ResourceDictionary Source="Styles/MainWindow/ToolBarTemplate.xaml"/>
<ResourceDictionary Source="Styles/MainWindow/Header/StyleHeaderButton.xaml"/>
<ResourceDictionary Source="Styles/MainWindow/Header/StyleHeaderButtonClosePath.xaml"/>
<!--#endregion Header-->
<!--#endregion Header-->

<!--#endregion MainWindow-->

Expand Down
79 changes: 11 additions & 68 deletions SimpleStateMachineNodeEditor/Helpers/Commands/Command.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,129 +4,72 @@

namespace SimpleStateMachineNodeEditor.Helpers.Commands
{
public class Command<TParameter, TResult> : CommandWithUndoRedo, ICommand, ICloneable
public class Command<TParameter, TResult> : ICommandWithUndoRedo, ICommand, ICloneable
{

private readonly Func<TParameter, TResult, TResult> _execute;

/// <summary>
/// Функция отмены команды
/// </summary>
private readonly Func<TParameter, TResult, TResult> _unExecute;

public Action OnExecute { get; set; }

/// <summary>
/// Параметр, который был передан в команду при выполнении
/// </summary>
public TParameter Parameters { get; set; }

/// <summary>
/// Результат выполнения команды
/// Например здесь может храниться список объектов, которые были изменены
public TResult Result { get; set; }
/// </summary>


/// <summary>
/// Клонирование текущей команды, для записи в стек выполненных или отмененных команд
/// </summary>
/// <returns></returns>
public object Clone()
{

{
return new Command<TParameter, TResult>(_execute, _unExecute, OnExecute)
{
Parameters = this.Parameters,
Result = this.Result
};
}

/// <summary>
/// Требуется интерфейсом ICloneable, не используется
/// </summary>

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

/// <summary>
/// Требуется интерфейсом ICloneable, не используется
/// </summary>
/// <param name="parameter"></param>
/// <returns>Всегда возвращает true</returns>
public bool CanExecute(object parameter)
{
return true;
}

/// <summary>
/// Выполнение команды
/// </summary>
/// <param name="parameter"> Параметр команды </param>
public void Execute(object parameter)
{
//Запоминаем параметр ( чтобы можно было егоже передать в отмену)
Parameters = parameter.Cast<TParameter>();

//Выполняем команду и запоминаем результат ( чтобы можно было выполнить отмену именно для этого результата)
Result = this._execute(Parameters, Result).Cast<TResult>();

//Добавляем копию команды в стек команд, которые можно отменить
CommandWithUndoRedo.AddInUndo(this.Clone() as CommandWithUndoRedo);
ICommandWithUndoRedo.AddInUndo(this.Clone() as ICommandWithUndoRedo);

//Очищаем список отмененнных команд ( началась новая ветка изменений)
CommandWithUndoRedo.StackRedo.Clear();
ICommandWithUndoRedo.StackRedo.Clear();

//Очищаем результат ( чтобы не передавать его при повторном выполнении)
Result = default(TResult);

//Очищаем параметр ( чтобы не передавать его при повторном выполнении)
Parameters = default(TParameter);

OnExecute?.Invoke();
}

/// <summary>
/// Отмена команды
/// </summary>
public void UnExecute()
{
//Выполняем отмену команду
this._unExecute(Parameters, Result);

//Добавляем копию команды в стек команд, которые можно выполнить повторно
CommandWithUndoRedo.AddInRedo(this.Clone() as CommandWithUndoRedo);
ICommandWithUndoRedo.AddInRedo(this.Clone() as ICommandWithUndoRedo);
}

/// <summary>
/// Повторное выполнения команды
/// </summary>
public void Execute()
public void ExecuteWithSubscribe()
{
//Выполянем команду
this.Result = this._execute(this.Parameters, this.Result);

//Добавляем копию команды в стек команд, которые можно отменить
CommandWithUndoRedo.AddInUndo(this.Clone() as CommandWithUndoRedo);
ICommandWithUndoRedo.AddInUndo(this.Clone() as ICommandWithUndoRedo);
}

/// <summary>
/// Создать отменяемую команду
/// </summary>
/// <param name="owner">Объкт, которому принадлежит команда</param>
/// <param name="execute">Функция, которая будет вызвана при выполнении команды</param>
/// <param name="unExecute">Функция, которая будет вызвана при отмене команды</param>
public Command(Func<TParameter, TResult, TResult> execute, Func<TParameter, TResult, TResult> unExecute, Action onExecute = null)
public Command(Func<TParameter, TResult, TResult> ExecuteWithSubscribe, Func<TParameter, TResult, TResult> unExecute, Action onExecute = null)
{
_execute = execute;
_execute = ExecuteWithSubscribe;

_unExecute = unExecute;

OnExecute += onExecute;


OnExecute += onExecute;
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using System.Collections.Generic;


namespace SimpleStateMachineNodeEditor.Helpers.Commands
{
public interface ICommandWithUndoRedo
{
public static Stack<ICommandWithUndoRedo> StackRedo { get; set; } = new Stack<ICommandWithUndoRedo>();

public static Stack<ICommandWithUndoRedo> StackUndo { get; set; } = new Stack<ICommandWithUndoRedo>();

public static void Redo()
{
if (StackRedo.Count > 0)
{
ICommandWithUndoRedo last = StackRedo.Pop();
last.ExecuteWithSubscribe();
}
}

public static void Undo()
{
if (StackUndo.Count > 0)
{
ICommandWithUndoRedo last = StackUndo.Pop();
last.UnExecute();
}
}

public static ICommandWithUndoRedo AddInRedo(ICommandWithUndoRedo command)
{
StackRedo.Push(command);

return command;
}

public static ICommandWithUndoRedo AddInUndo(ICommandWithUndoRedo command)
{
StackUndo.Push(command);

return command;
}

public void ExecuteWithSubscribe();
public void UnExecute();

}
}
62 changes: 0 additions & 62 deletions SimpleStateMachineNodeEditor/Helpers/Commands/Interface1.cs

This file was deleted.

This file was deleted.

Loading