Skip to content

Commit 378cbbc

Browse files
committed
some fix for commands and start select for connectors
1 parent 0cf9350 commit 378cbbc

13 files changed

Lines changed: 173 additions & 70 deletions

SimpleStateMachineNodeEditor/Helpers/Commands/Command.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11

2+
using SimpleStateMachineNodeEditor.Helpers.Extensions;
23
using System;
34
using System.Windows.Input;
45

56
namespace SimpleStateMachineNodeEditor.Helpers.Commands
67
{
78

8-
public class Command<TParameter, TResult> : CommandUndoRedo, ICommand, ICloneable where TParameter : class where TResult : class
9+
public class Command<TParameter, TResult> : CommandUndoRedo, ICommand, ICloneable
910
{
1011

1112
private readonly Func<TParameter, TResult, TResult> _execute;
@@ -74,12 +75,11 @@ public bool CanExecute(object parameter)
7475
/// <param name="parameter"> Параметр команды </param>
7576
public void Execute(object parameter)
7677
{
77-
7878
//Запоминаем параметр ( чтобы можно было егоже передать в отмену)
79-
Parameters = (parameter as TParameter);
79+
Parameters = parameter.Cast<TParameter>();
8080

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

8484
//Если команду можно отменить
8585
if (CanUnExecute)
@@ -92,10 +92,10 @@ public void Execute(object parameter)
9292
}
9393

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

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

100100
OnExecute?.Invoke();
101101
}

SimpleStateMachineNodeEditor/Helpers/Commands/SimpleCommandWithParameter.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using SimpleStateMachineNodeEditor.Helpers.Extensions;
2+
using System;
23
using System.Windows.Input;
34

45
namespace SimpleStateMachineNodeEditor.Helpers.Commands
@@ -7,7 +8,7 @@ namespace SimpleStateMachineNodeEditor.Helpers.Commands
78
/// Команда без Undo/Redo
89
/// </summary>
910
/// <typeparam name="TParameter"></typeparam>
10-
public class SimpleCommandWithParameter<TParameter> : ICommand where TParameter : class
11+
public class SimpleCommandWithParameter<TParameter> : ICommand
1112
{
1213
/// <summary>
1314
/// Функция с параметром, которая будет вызвана при выполнении команды
@@ -41,7 +42,9 @@ public bool CanExecute(object parameter)
4142
/// <param name="parameter"> Параметр команды </param>
4243
public void Execute(object parameter)
4344
{
44-
this._execute(parameter as TParameter);
45+
46+
this._execute(parameter.Cast<TParameter>());
47+
4548
OnExecute?.Invoke();
4649
}
4750

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace SimpleStateMachineNodeEditor.Helpers.Enums
6+
{
7+
public enum SelectMode
8+
{
9+
noCorrect = 0,
10+
Click,
11+
ClickWithCtrl,
12+
ClickWithShift
13+
}
14+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace SimpleStateMachineNodeEditor.Helpers.Extensions
6+
{
7+
public static class ObjectExtension
8+
{
9+
public static T Cast<T>(this object obj)
10+
{
11+
return (obj is T) ? (T)obj : default(T);
12+
}
13+
14+
public static bool TryCast<T>(this object obj, out T newValue)
15+
{
16+
bool typeCorrect = obj is T;
17+
18+
newValue = typeCorrect?(T)obj:default(T);
19+
20+
return typeCorrect;
21+
}
22+
}
23+
}

SimpleStateMachineNodeEditor/SimpleStateMachineNodeEditor.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,4 @@
6262
</Page>
6363
</ItemGroup>
6464

65-
<ItemGroup>
66-
<Folder Include="Images\" />
67-
</ItemGroup>
68-
6965
</Project>

SimpleStateMachineNodeEditor/Styles/Colors.xaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
<SolidColorBrush x:Key="ColorMenuBorder" Color="#333337"/>
1414
<SolidColorBrush x:Key="ColorMenuBaground" Color="#1b1b1c"/>
1515

16+
<SolidColorBrush x:Key="ColorForeground" Color="White"/>
17+
18+
<SolidColorBrush x:Key="ColorSelectedElement" Color="Red"/>
1619
<!--#endregion Theme-->
1720

1821

SimpleStateMachineNodeEditor/View/ViewNode.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
66
xmlns:local="clr-namespace:SimpleStateMachineNodeEditor.View"
77
xmlns:NodeStyles="clr-namespace:SimpleStateMachineNodeEditor.Styles.Node"
8-
xmlns:View="clr-namespace:SimpleStateMachineNodeEditor.View"
8+
xmlns:View="clr-namespace:SimpleStateMachineNodeEditor.View" xmlns:enums="clr-namespace:SimpleStateMachineNodeEditor.Helpers.Enums"
99
mc:Ignorable="d" Focusable="True" AllowDrop="True" Visibility="Visible">
1010

1111
<Border x:Name="BorderElement" CornerRadius="5,5,5,5" BorderThickness="1,1,1,1" HorizontalAlignment="Left" VerticalAlignment="Top" MinWidth="80" Background="{StaticResource ColorNodeBody}" >
@@ -54,6 +54,6 @@
5454
</TransformGroup>
5555
</UserControl.RenderTransform>
5656
<UserControl.InputBindings>
57-
<MouseBinding x:Name="BindingSelect" Gesture="Ctrl+LeftClick" />
57+
<MouseBinding x:Name="BindingSelect" Gesture="Ctrl+LeftClick" CommandParameter="{x:Static enums:SelectMode.ClickWithCtrl}"/>
5858
</UserControl.InputBindings>
5959
</UserControl>

SimpleStateMachineNodeEditor/View/ViewNode.xaml.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using SimpleStateMachineNodeEditor.ViewModel;
1919
using SimpleStateMachineNodeEditor.Helpers;
2020
using SimpleStateMachineNodeEditor.Helpers.Transformations;
21+
using SimpleStateMachineNodeEditor.Helpers.Enums;
2122

2223
namespace SimpleStateMachineNodeEditor.View
2324
{
@@ -40,7 +41,6 @@ object IViewFor.ViewModel
4041
set { ViewModel = (ViewModelNode)value; }
4142
}
4243
#endregion ViewModel
43-
4444
public ViewNode()
4545
{
4646
InitializeComponent();
@@ -49,6 +49,7 @@ public ViewNode()
4949
SetupCommands();
5050

5151
}
52+
5253
#region Setup Binding
5354
private void SetupBinding()
5455
{
@@ -84,6 +85,15 @@ private void SetupBinding()
8485
});
8586
}
8687
#endregion Setup Binding
88+
#region Setup Commands
89+
private void SetupCommands()
90+
{
91+
this.WhenActivated(disposable =>
92+
{
93+
this.BindCommand(this.ViewModel, x => x.CommandSelect, x => x.BindingSelect).DisposeWith(disposable);
94+
});
95+
}
96+
#endregion Setup Commands
8797
#region Setup Events
8898
private void SetupEvents()
8999
{
@@ -107,7 +117,7 @@ private void SetupEvents()
107117
private void OnEventMouseLeftDowns(MouseButtonEventArgs e)
108118
{
109119
Keyboard.Focus(this);
110-
this.ViewModel.CommandSelect.Execute(true);
120+
this.ViewModel.CommandSelect.Execute(SelectMode.Click);
111121
}
112122
private void Validate(RoutedEventArgs e)
113123
{
@@ -162,14 +172,6 @@ private void OnEventCollapse()
162172

163173
}
164174
#endregion Setup Events
165-
#region Setup Commands
166-
private void SetupCommands()
167-
{
168-
this.WhenActivated(disposable =>
169-
{
170-
this.BindCommand(this.ViewModel, x => x.CommandSelect, x => x.BindingSelect);
171-
});
172-
}
173-
#endregion Setup Commands
175+
174176
}
175177
}

SimpleStateMachineNodeEditor/View/ViewNodesCanvas.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111
<KeyBinding x:Name="BindingSelectAll" Key="A" Modifiers="Control" />
112112
<KeyBinding x:Name="BindingAddNode" Key="N" Modifiers="Control" />
113113
<KeyBinding x:Name="BindingDeleteNode" Key="Delete" />
114-
<MouseBinding x:Name="BindingSelect" Gesture="Ctrl+LeftClick" />
114+
<MouseBinding x:Name="BindingSelect" Gesture="Ctrl+LeftClick"/>
115115
<MouseBinding x:Name="BindingCut" Gesture="Alt+LeftClick" />
116116
<MouseBinding x:Name="BindingZoom" Gesture="WheelClick"/>
117117
</UserControl.InputBindings>

SimpleStateMachineNodeEditor/View/ViewRightConnector.xaml.cs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using SimpleStateMachineNodeEditor.Helpers;
1717
using SimpleStateMachineNodeEditor.ViewModel;
1818
using SimpleStateMachineNodeEditor.Helpers.Transformations;
19+
using SimpleStateMachineNodeEditor.Helpers.Enums;
1920

2021
namespace SimpleStateMachineNodeEditor.View
2122
{
@@ -54,21 +55,22 @@ private void SetupBinding()
5455
{
5556
Canvas.SetZIndex((UIElement)this.VisualParent, this.ViewModel.Node.Zindex+2);
5657

58+
this.OneWayBind(this.ViewModel, x => x.Visible, x => x.RightConnector.Visibility).DisposeWith(disposable);
59+
5760
this.OneWayBind(this.ViewModel, x => x.Name, x => x.TextBoxElement.Text).DisposeWith(disposable);
5861

5962
this.OneWayBind(this.ViewModel, x => x.TextEnable, x => x.TextBoxElement.IsEnabled).DisposeWith(disposable);
6063

61-
this.OneWayBind(this.ViewModel, x => x.FormEnable, x => x.EllipseElement.IsEnabled).DisposeWith(disposable);
64+
this.OneWayBind(this.ViewModel, x => x.Foreground, x => x.TextBoxElement.Foreground).DisposeWith(disposable);
6265

66+
this.OneWayBind(this.ViewModel, x => x.FormEnable, x => x.EllipseElement.IsEnabled).DisposeWith(disposable);
6367

6468
this.OneWayBind(this.ViewModel, x => x.FormStroke, x => x.EllipseElement.Stroke).DisposeWith(disposable);
6569

6670
this.OneWayBind(this.ViewModel, x => x.FormStrokeThickness, x => x.EllipseElement.StrokeThickness).DisposeWith(disposable);
6771

6872
this.Bind(this.ViewModel, x => x.FormFill, x => x.EllipseElement.Fill).DisposeWith(disposable);
6973

70-
this.OneWayBind(this.ViewModel, x => x.Visible, x => x.RightConnector.Visibility).DisposeWith(disposable);
71-
7274
this.WhenAnyValue(x => x.ViewModel.Node.Size, x => x.ViewModel.Node.Point1.Value, x => x.ViewModel.Node.NodesCanvas.Scale.Scales.Value)
7375
.Subscribe(_ => { UpdatePositionConnectPoin(); }).DisposeWith(disposable);
7476

@@ -122,15 +124,24 @@ private void ConnectDrag(MouseButtonEventArgs e)
122124

123125
private void ConnectorDrag(MouseButtonEventArgs e)
124126
{
125-
if (!this.ViewModel.TextEnable)
126-
return;
127-
if (!Keyboard.IsKeyDown(Key.LeftShift))
128-
return;
127+
if (!this.ViewModel.TextEnable)
128+
return;
129+
if (Keyboard.IsKeyDown(Key.LeftAlt))
130+
{
129131
this.ViewModel.CommandConnectorDrag.Execute();
130132
DataObject data = new DataObject();
131133
data.SetData("Connector", this.ViewModel);
132134
DragDrop.DoDragDrop(this, data, DragDropEffects.Link);
133135
e.Handled = true;
136+
}
137+
else if (Keyboard.IsKeyDown(Key.LeftAlt))
138+
{
139+
140+
}
141+
else
142+
{
143+
this.ViewModel.CommandSelect.Execute(SelectMode.Click);
144+
}
134145

135146
}
136147

0 commit comments

Comments
 (0)