Skip to content

Commit 10f0ee9

Browse files
committed
before
1 parent b4a45e2 commit 10f0ee9

19 files changed

+328
-163
lines changed

SimpleStateMachineNodeEditor/Helpers/Commands/Command.cs

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-

2-
using SimpleStateMachineNodeEditor.Helpers.Extensions;
1+
using SimpleStateMachineNodeEditor.Helpers.Extensions;
32
using System;
43
using System.Windows.Input;
54

65
namespace SimpleStateMachineNodeEditor.Helpers.Commands
76
{
8-
9-
public class Command<TParameter, TResult> : CommandUndoRedo, ICommand, ICloneable
7+
public class Command<TParameter, TResult> : CommandWithUndoRedo, ICommand, ICloneable
108
{
119

1210
private readonly Func<TParameter, TResult, TResult> _execute;
@@ -29,20 +27,14 @@ public class Command<TParameter, TResult> : CommandUndoRedo, ICommand, ICloneabl
2927
public TResult Result { get; set; }
3028
/// </summary>
3129

32-
/// <summary>
33-
/// Флаг того, является ли команда отменяемой
34-
/// </summary>
35-
private bool CanUnExecute
36-
{
37-
get { return _unExecute != null; }
38-
}
3930

4031
/// <summary>
4132
/// Клонирование текущей команды, для записи в стек выполненных или отмененных команд
4233
/// </summary>
4334
/// <returns></returns>
4435
public object Clone()
4536
{
37+
4638
return new Command<TParameter, TResult>(_execute, _unExecute, OnExecute)
4739
{
4840
Parameters = this.Parameters,
@@ -81,15 +73,11 @@ public void Execute(object parameter)
8173
//Выполняем команду и запоминаем результат ( чтобы можно было выполнить отмену именно для этого результата)
8274
Result = this._execute(Parameters, Result).Cast<TResult>();
8375

84-
//Если команду можно отменить
85-
if (CanUnExecute)
86-
{
87-
//Добавляем копию команды в стек команд, которые можно отменить
88-
AddInUndo(this.Clone() as CommandUndoRedo);
76+
//Добавляем копию команды в стек команд, которые можно отменить
77+
CommandWithUndoRedo.AddInUndo(this.Clone() as CommandWithUndoRedo);
8978

90-
//Очищаем список отмененнных команд ( началась новая ветка изменений)
91-
StackRedo.Clear();
92-
}
79+
//Очищаем список отмененнных команд ( началась новая ветка изменений)
80+
CommandWithUndoRedo.StackRedo.Clear();
9381

9482
//Очищаем результат ( чтобы не передавать его при повторном выполнении)
9583
Result = default(TResult);
@@ -103,37 +91,25 @@ public void Execute(object parameter)
10391
/// <summary>
10492
/// Отмена команды
10593
/// </summary>
106-
public override void UnExecute()
107-
{
94+
public void UnExecute()
95+
{
10896
//Выполняем отмену команду
10997
this._unExecute(Parameters, Result);
11098

11199
//Добавляем копию команды в стек команд, которые можно выполнить повторно
112-
AddInRedo(this.Clone() as CommandUndoRedo);
100+
CommandWithUndoRedo.AddInRedo(this.Clone() as CommandWithUndoRedo);
113101
}
114102

115103
/// <summary>
116104
/// Повторное выполнения команды
117105
/// </summary>
118-
public override void Execute()
106+
public void Execute()
119107
{
120108
//Выполянем команду
121109
this.Result = this._execute(this.Parameters, this.Result);
122110

123111
//Добавляем копию команды в стек команд, которые можно отменить
124-
AddInUndo(this.Clone() as CommandUndoRedo);
125-
}
126-
127-
/// <summary>
128-
/// Создать неотменяемую команду ( Для создания отменяемой команды, добавьте функцию, которая будет вызвана при отмене)
129-
/// </summary>
130-
/// <param name="owner">Объкт, которому принадлежит команда</param>
131-
/// <param name="action">Функция, которая будет вызвана при выполнении команды</param>
132-
private Command(Func<TParameter, TResult, TResult> execute, Action onExecute = null)
133-
{
134-
_execute = execute;
135-
136-
OnExecute += onExecute;
112+
CommandWithUndoRedo.AddInUndo(this.Clone() as CommandWithUndoRedo);
137113
}
138114

139115
/// <summary>
@@ -142,9 +118,15 @@ private Command(Func<TParameter, TResult, TResult> execute, Action onExecute = n
142118
/// <param name="owner">Объкт, которому принадлежит команда</param>
143119
/// <param name="execute">Функция, которая будет вызвана при выполнении команды</param>
144120
/// <param name="unExecute">Функция, которая будет вызвана при отмене команды</param>
145-
public Command(Func<TParameter, TResult, TResult> execute, Func<TParameter, TResult, TResult> unExecute, Action onExecute = null) : this(execute, onExecute)
121+
public Command(Func<TParameter, TResult, TResult> execute, Func<TParameter, TResult, TResult> unExecute, Action onExecute = null)
146122
{
123+
_execute = execute;
124+
147125
_unExecute = unExecute;
126+
127+
OnExecute += onExecute;
128+
129+
148130
}
149131
}
150132
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System.Collections.Generic;
2+
3+
4+
namespace SimpleStateMachineNodeEditor.Helpers.Commands
5+
{
6+
public interface CommandWithUndoRedo
7+
{
8+
public static Stack<CommandWithUndoRedo> StackRedo { get; set; } = new Stack<CommandWithUndoRedo>();
9+
10+
public static Stack<CommandWithUndoRedo> StackUndo { get; set; } = new Stack<CommandWithUndoRedo>();
11+
12+
public static void Redo()
13+
{
14+
if (StackRedo.Count > 0)
15+
{
16+
CommandWithUndoRedo last = StackRedo.Pop();
17+
last.Execute();
18+
}
19+
}
20+
21+
public static void Undo()
22+
{
23+
if (StackUndo.Count > 0)
24+
{
25+
CommandWithUndoRedo last = StackUndo.Pop();
26+
last.UnExecute();
27+
}
28+
}
29+
30+
public static CommandWithUndoRedo AddInRedo(CommandWithUndoRedo command)
31+
{
32+
StackRedo.Push(command);
33+
34+
return command;
35+
}
36+
37+
public static CommandWithUndoRedo AddInUndo(CommandWithUndoRedo command)
38+
{
39+
StackUndo.Push(command);
40+
41+
return command;
42+
}
43+
44+
public void Execute();
45+
public void UnExecute();
46+
47+
}
48+
}

SimpleStateMachineNodeEditor/Helpers/Commands/UndoRedoForCommand.cs renamed to SimpleStateMachineNodeEditor/Helpers/Commands/Interface1.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
1-
using System.Collections.Generic;
2-
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
34

45
namespace SimpleStateMachineNodeEditor.Helpers.Commands
56
{
6-
public abstract class CommandUndoRedo
7+
public interface Interface1
78
{
89
/// <summary>
910
/// Стек отмененных команд, которые можно выполнить повторно
1011
/// </summary>
11-
public static Stack<CommandUndoRedo> StackRedo { get; set; } = new Stack<CommandUndoRedo>();
12+
public static Stack<Interface1> StackRedo { get; set; } = new Stack<Interface1>();
1213

1314
/// <summary>
1415
/// Стек выполненных команд, которые можно отменить
1516
/// </summary>
16-
public static Stack<CommandUndoRedo> StackUndo { get; set; } = new Stack<CommandUndoRedo>();
17+
public static Stack<Interface1> StackUndo { get; set; } = new Stack<Interface1>();
1718

1819
/// <summary>
1920
/// Функция для команды повторного выполнения
2021
/// </summary>
2122
public static void Redo()
2223
{
23-
if (CommandUndoRedo.StackRedo.Count > 0)
24+
if (CommandWithUndoRedo.StackRedo.Count > 0)
2425
{
25-
CommandUndoRedo last = CommandUndoRedo.StackRedo.Pop();
26+
CommandWithUndoRedo last = CommandWithUndoRedo.StackRedo.Pop();
2627
last.Execute();
2728
}
2829
}
@@ -32,9 +33,9 @@ public static void Redo()
3233
/// </summary>
3334
public static void Undo()
3435
{
35-
if (CommandUndoRedo.StackUndo.Count > 0)
36+
if (CommandWithUndoRedo.StackUndo.Count > 0)
3637
{
37-
CommandUndoRedo last = CommandUndoRedo.StackUndo.Pop();
38+
CommandWithUndoRedo last = CommandWithUndoRedo.StackUndo.Pop();
3839
last.UnExecute();
3940
}
4041
}
@@ -45,15 +46,15 @@ public static void Undo()
4546
/// <summary>
4647
/// Добавить команду в стек команд, которые можно выполнить повторно
4748
/// </summary>
48-
public void AddInRedo(CommandUndoRedo command)
49+
public void AddInRedo(Interface1 command)
4950
{
5051
StackRedo.Push(command);
5152
}
5253

5354
/// <summary>
5455
/// Добавить команду в стек команд, которые можно отменить
5556
/// </summary>
56-
public void AddInUndo(CommandUndoRedo command)
57+
public void AddInUndo(Interface1 command)
5758
{
5859
StackUndo.Push(command);
5960
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using ReactiveUI;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Reactive.Concurrency;
5+
using System.Text;
6+
using System.Windows.Input;
7+
8+
namespace SimpleStateMachineNodeEditor.Helpers.Commands
9+
{
10+
public class ReactiveCommandWithUndoRedo<TParam, TResult> : ReactiveCommand<TParam, TResult>
11+
{
12+
//private readonly Func<TParam, TResult, TResult> _unExecute;
13+
//private readonly Func<TParam, TResult> _unExecute2;
14+
//public void UnExecute()
15+
//{
16+
// _unExecute = _unExecute2;
17+
// _unExecute2 = _unExecute;
18+
// //Выполняем отмену команду
19+
// this._unExecute(Parameters, Result);
20+
21+
// //Добавляем копию команды в стек команд, которые можно выполнить повторно
22+
// CommandWithUndoRedo.AddInRedo(this.Clone() as CommandWithUndoRedo);
23+
//}
24+
25+
///// <summary>
26+
///// Повторное выполнения команды
27+
///// </summary>
28+
//public void Execute()
29+
//{
30+
// //Выполянем команду
31+
// this.Result = this._execute(this.Parameters, this.Result);
32+
33+
// //Добавляем копию команды в стек команд, которые можно отменить
34+
// CommandWithUndoRedo.AddInUndo(this.Clone() as CommandWithUndoRedo);
35+
//}
36+
37+
protected internal ReactiveCommandWithUndoRedo(Func<TParam, IObservable<TResult>> execute, IObservable<bool> canExecute, IScheduler outputScheduler):base(execute, canExecute, outputScheduler)
38+
{
39+
40+
}
41+
42+
}
43+
}

SimpleStateMachineNodeEditor/Helpers/Commands/SimpleCommandWithParameter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using SimpleStateMachineNodeEditor.Helpers.Extensions;
22
using System;
3+
using System.DirectoryServices;
34
using System.Windows.Input;
45

56
namespace SimpleStateMachineNodeEditor.Helpers.Commands
@@ -58,5 +59,10 @@ public SimpleCommandWithParameter(Action<TParameter> execute, Action onExecute =
5859
_execute = execute;
5960
OnExecute += onExecute;
6061
}
62+
63+
public static SimpleCommandWithParameter<TParameter> Create<TParameter>(Action<TParameter> execute, Action onExecute = null)
64+
{
65+
return new SimpleCommandWithParameter<TParameter>(execute, onExecute);
66+
}
6167
}
6268
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Reactive;
4+
using System.Reactive.Linq;
5+
using System.Text;
6+
7+
namespace SimpleStateMachineNodeEditor.Helpers.Extensions
8+
{
9+
public static class IObservableExtension
10+
{
11+
public static IObservable<Unit> WithoutParameter<TDontCare>(this IObservable<TDontCare> source)
12+
{
13+
return source.Select(_ => Unit.Default);
14+
}
15+
}
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using ReactiveUI;
2+
using SimpleStateMachineNodeEditor.Helpers.Commands;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Text;
6+
7+
namespace SimpleStateMachineNodeEditor.Helpers.Extensions
8+
{
9+
public static class ReactiveCommandExtension
10+
{
11+
public static IDisposable ExecuteWithSubscribe<TParam, TResult>(this ReactiveCommand<TParam, TResult> reactiveCommand, TParam parameter = default)
12+
{
13+
return reactiveCommand.Execute(parameter).Subscribe();
14+
}
15+
public static ReactiveCommandWithUndoRedo<TParam, TResult> CreateCommandWithUndoRedo<TParam, TResult>(TParam parameter = default)
16+
{
17+
return null;
18+
}
19+
}
20+
}

SimpleStateMachineNodeEditor/View/MainWindow.xaml

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
<!--OpacityMask - it's color on MouseOver-->
2424
<Menu Background="{StaticResource ColorMenuBackground}" Foreground="{StaticResource ColorMenuForeground}" BorderBrush="{StaticResource ColorMenuBorder}" OpacityMask="{StaticResource ColorMenuBackgroundMouseOver}" Template="{StaticResource MenuTemplate}" BorderThickness="1" HorizontalAlignment="Left" VerticalAlignment="Center">
2525
<MenuItem Header="File" x:Name="Item" Style="{StaticResource StyleMenuItem}" Margin="3,0,3,0">
26-
<MenuItem Header="New" x:Name="ItemNew" InputGestureText="Ctrl+Shift+N" Style="{StaticResource StyleMenuItem}">
26+
<MenuItem Header="New" x:Name="ItemNew" InputGestureText="Ctrl+N" Style="{StaticResource StyleMenuItem}">
2727
<MenuItem.Icon>
2828
<Rectangle Fill="{StaticResource IconNewSheme}" Height="15" Width="15"/>
2929
</MenuItem.Icon>
3030
</MenuItem>
31-
<MenuItem Header="Open" x:Name="ItemOpen" InputGestureText="Ctrl+Shift+O" Style="{StaticResource StyleMenuItem}" >
31+
<MenuItem Header="Open" x:Name="ItemOpen" InputGestureText="Ctrl+O" Style="{StaticResource StyleMenuItem}" >
3232
<MenuItem.Icon>
3333
<Rectangle Fill="{StaticResource IconImportScheme}" Height="15" Width="15"/>
3434
</MenuItem.Icon>
@@ -108,10 +108,10 @@
108108
</DockPanel>
109109
<ToolBarTray Grid.Row="1" IsLocked="True" Background="{x:Null}">
110110
<ToolBar Style="{StaticResource ToolBarTemplate}" Background="{x:Null}" Foreground="{x:Null}" >
111-
<Button x:Name="ButtonNewScheme" ToolTip="New (Ctrl+Shift+N)" Style="{StaticResource StyleHeaderButton}" Background="{StaticResource ColorWindowHeader}" BorderBrush="{StaticResource ColorWindowHeaderButtonBackgroundMouseOver}">
111+
<Button x:Name="ButtonNewScheme" ToolTip="New (Ctrl+N)" Style="{StaticResource StyleHeaderButton}" Background="{StaticResource ColorWindowHeader}" BorderBrush="{StaticResource ColorWindowHeaderButtonBackgroundMouseOver}">
112112
<Rectangle Fill="{StaticResource IconNewSheme}" Height="15" Width="15"/>
113113
</Button>
114-
<Button x:Name="ButtonImportScheme" ToolTip="Open (Ctrl+Shift+O)" Style="{StaticResource StyleHeaderButton}" Background="{StaticResource ColorWindowHeader}" BorderBrush="{StaticResource ColorWindowHeaderButtonBackgroundMouseOver}">
114+
<Button x:Name="ButtonImportScheme" ToolTip="Open (Ctrl+O)" Style="{StaticResource StyleHeaderButton}" Background="{StaticResource ColorWindowHeader}" BorderBrush="{StaticResource ColorWindowHeaderButtonBackgroundMouseOver}">
115115
<Rectangle Fill="{StaticResource IconImportScheme}" Height="15" Width="15"/>
116116
</Button>
117117
<Button x:Name="ButtonSave" ToolTip="Save (Ctrl+S)" Style="{StaticResource StyleHeaderButton}" Background="{StaticResource ColorWindowHeader}" BorderBrush="{StaticResource ColorWindowHeaderButtonBackgroundMouseOver}">
@@ -202,7 +202,7 @@
202202
VirtualizingStackPanel.CacheLengthUnit="Page"
203203
VirtualizingStackPanel.ScrollUnit="Pixel">
204204
<ListBox.InputBindings>
205-
<KeyBinding x:Name="BindingCopyError" Key="C" Modifiers="Control" />
205+
<KeyBinding x:Name="BindingCopyError" Gesture="Ctrl+C"/>
206206
</ListBox.InputBindings>
207207
<ListBox.ContextMenu>
208208
<ContextMenu Template="{StaticResource TemplateContextMenu}" Background="{StaticResource ColorMenuBackground}" BorderBrush="{StaticResource ColorMenuBorder}" OpacityMask="{StaticResource ColorWindowHeaderButtonBackgroundMouseOver}" Foreground="{StaticResource ColorMenuForeground}" BorderThickness="1" HorizontalAlignment="Left" VerticalAlignment="Center" >
@@ -226,7 +226,12 @@
226226
<Window.InputBindings>
227227
<!--<KeyBinding x:Name="BindingUndo" Key="Z" Modifiers="Control" />
228228
<KeyBinding x:Name="BindingRedo" Key="Y" Modifiers="Control" />-->
229-
<!--<KeyBinding x:Name="BindingSave" Key="S" Modifiers="Control" />-->
229+
<KeyBinding x:Name="BindingSave" Key="S" Modifiers="Control" />
230+
<KeyBinding x:Name="BindingSaveAs" Gesture="Ctrl+Shift+S"/>
231+
<KeyBinding x:Name="BindingOpen" Gesture="Ctrl+Shift+O" />
232+
<KeyBinding x:Name="BindingNew" Gesture="Ctrl+Shift+N"/>
233+
<KeyBinding x:Name="BindingExit" Key="F4" Modifiers="Alt"/>
234+
<KeyBinding x:Name="BindingExportToJpeg" Key="F4" Modifiers="Alt"/>
230235
<!--<KeyBinding x:Name="BindingSelectAll" Key="A" Modifiers="Control" />
231236
<KeyBinding x:Name="BindingAddNode" Key="N" Modifiers="Control" />
232237
<KeyBinding x:Name="BindingDeleteSelectedElements" Key="Delete" />

0 commit comments

Comments
 (0)