Skip to content

Commit afb31a6

Browse files
committed
for error then load xml
1 parent fd45b5f commit afb31a6

6 files changed

Lines changed: 129 additions & 39 deletions

File tree

SimpleStateMachineNodeEditor/Styles/Colors.xaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919
<!--#region -->
2020
<!--#endregion-->
2121
<!--White-->
22-
<SolidColorBrush x:Key="ColorConnector" Color="White"/>
22+
<SolidColorBrush x:Key="ColorConnector" Color="White"/>
23+
24+
25+
<SolidColorBrush x:Key="ColorConnectorEllipseEnableBackground" Color="#FFF4F4F5"/>
26+
<SolidColorBrush x:Key="ColorConnectorEllipseEnableBorder" Color="Black"/>
2327

2428
<!--#region Node-->
2529

SimpleStateMachineNodeEditor/View/ViewLeftConnector.xaml.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,6 @@ private void SetupBinding()
5151
this.WhenActivated(disposable =>
5252
{
5353

54-
this.ViewModel.FormFill = Application.Current.Resources["ColorLeftConnectorEllipseEnableBackground"] as SolidColorBrush;
55-
this.ViewModel.FormStroke = Application.Current.Resources["ColorLeftConnectorEllipseEnableBorder"] as SolidColorBrush;
56-
5754
// Имя перехода ( вводится в узле)
5855
this.OneWayBind(this.ViewModel, x => x.Name, x => x.Text.Text).DisposeWith(disposable);
5956

SimpleStateMachineNodeEditor/View/ViewRightConnector.xaml.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,6 @@ private void SetupBinding()
5555
{
5656
Canvas.SetZIndex((UIElement)this.VisualParent, this.ViewModel.Node.Zindex+2);
5757

58-
//this.ViewModel.FormFill = Application.Current.Resources["ColorRightConnectorEllipseEnableBackground"] as SolidColorBrush;
59-
//this.ViewModel.FormStroke = Application.Current.Resources["ColorRightConnectorEllipseEnableBorder"] as SolidColorBrush;
60-
6158
// Имя перехода ( вводится в узле)
6259
this.OneWayBind(this.ViewModel, x => x.Name, x => x.Text.Text).DisposeWith(disposable);
6360

@@ -107,8 +104,6 @@ private void SetupEvents()
107104
this.Grid.Events().PreviewMouseLeftButtonDown.Subscribe(e => ConnectorDrag(e)).DisposeWith(disposable);
108105
this.Grid.Events().PreviewDragEnter.Subscribe(e => ConnectorDragEnter(e)).DisposeWith(disposable);
109106
this.Grid.Events().PreviewDrop.Subscribe(e => ConnectorDrop(e)).DisposeWith(disposable);
110-
111-
112107
});
113108
}
114109

SimpleStateMachineNodeEditor/ViewModel/ViewModelConnector.cs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ public class ViewModelConnector : ReactiveObject
5454
/// <summary>
5555
/// Цвет рамки, вокруг перехода
5656
/// </summary>
57-
[Reactive] public Brush FormStroke { get; set; } = Application.Current.Resources["ColorRightConnectorEllipseEnableBorder"] as SolidColorBrush;
57+
[Reactive] public Brush FormStroke { get; set; } = Application.Current.Resources["ColorConnectorEllipseEnableBorder"] as SolidColorBrush;
5858

5959
/// <summary>
6060
/// Цвет перехода
6161
/// </summary>
62-
[Reactive] public Brush FormFill { get; set; } = Application.Current.Resources["ColorRightConnectorEllipseEnableBackground"] as SolidColorBrush;
62+
[Reactive] public Brush FormFill { get; set; } = Application.Current.Resources["ColorConnectorEllipseEnableBackground"] as SolidColorBrush;
6363

6464
[Reactive] public double FormStrokeThickness { get; set; } = 1;
6565

@@ -242,17 +242,43 @@ public XElement ToXElement()
242242
return element;
243243
}
244244

245-
public static ViewModelConnect FromXElement(ViewModelNodesCanvas nodesCanvas, XElement node)
245+
public static ViewModelConnect FromXElement(ViewModelNodesCanvas nodesCanvas, XElement node, out string errorMessage, Func<string, bool> actionForCheck)
246246
{
247+
ViewModelConnect viewModelConnect = null;
248+
249+
errorMessage = null;
247250
string name = node.Attribute("Name")?.Value;
248251
string from = node.Attribute("From")?.Value;
249252
string to = node.Attribute("To")?.Value;
253+
254+
if (string.IsNullOrEmpty(name))
255+
{
256+
errorMessage = "Connect without name";
257+
return viewModelConnect;
258+
}
259+
if (string.IsNullOrEmpty(from))
260+
{
261+
errorMessage = "Connect without from point";
262+
return viewModelConnect;
263+
}
264+
if (string.IsNullOrEmpty(to))
265+
{
266+
errorMessage = "Connect without to point";
267+
return viewModelConnect;
268+
}
269+
if (actionForCheck(name))
270+
{
271+
errorMessage = String.Format("Contains more than one connect with name \"{0}\"", name);
272+
return viewModelConnect;
273+
}
274+
250275
ViewModelNode nodeFrom = nodesCanvas.Nodes.Single(x => x.Name == from);
251276
ViewModelNode nodeTo = nodesCanvas.Nodes.Single(x => x.Name == to);
252-
ViewModelConnect viewModelConnect = null;
277+
253278
nodeFrom.CurrentConnector.Name = name;
254-
255-
if(nodeFrom == nodeTo)
279+
280+
281+
if (nodeFrom == nodeTo)
256282
{
257283
nodeFrom.CurrentConnector.CommandSetAsLoop.Execute();
258284
}

SimpleStateMachineNodeEditor/ViewModel/ViewModelNode.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,26 @@ public XElement ToXElement()
197197
return element;
198198
}
199199

200-
public static ViewModelNode FromXElement(ViewModelNodesCanvas nodesCanvas, XElement node)
200+
public static ViewModelNode FromXElement(ViewModelNodesCanvas nodesCanvas, XElement node, out string errorMessage, Func<string, bool> actionForCheck)
201201
{
202-
ViewModelNode viewModelNode = new ViewModelNode(nodesCanvas);
202+
errorMessage = null;
203+
ViewModelNode viewModelNode = null;
203204
string name = node.Attribute("Name")?.Value;
204-
if (name != null)
205-
viewModelNode.Name = name;
205+
206+
if (string.IsNullOrEmpty(name))
207+
{
208+
errorMessage = "Node without name";
209+
return viewModelNode;
210+
}
211+
212+
if (actionForCheck(name))
213+
{
214+
errorMessage = String.Format("Contains more than one node with name \"{0}\"", name);
215+
return viewModelNode;
216+
}
217+
218+
viewModelNode = new ViewModelNode(nodesCanvas);
219+
viewModelNode.Name = name;
206220

207221
var position = node.Attribute("Position")?.Value;
208222
if(position!=null)

SimpleStateMachineNodeEditor/ViewModel/ViewModelNodesCanvas.cs

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ private void SetAsStart(ViewModelNode node)
9999
public SimpleCommandWithParameter<MyPoint> CommandSelect { get; set; }
100100
public SimpleCommandWithParameter<MyPoint> CommandCut { get; set; }
101101
public SimpleCommandWithParameter<MyPoint> CommandPartMoveAllNode { get; set; }
102+
public SimpleCommandWithParameter<string> CommandLogDebug { get; set; }
103+
public SimpleCommandWithParameter<string> CommandLogError { get; set; }
104+
public SimpleCommandWithParameter<string> CommandLogInformation { get; set; }
105+
public SimpleCommandWithParameter<string> CommandLogWarning { get; set; }
102106
public SimpleCommandWithParameter<MyPoint> CommandPartMoveAllSelectedNode { get; set; }
103107

104108
public SimpleCommandWithParameter<ViewModelConnector> CommandAddFreeConnect { get; set; }
@@ -138,6 +142,11 @@ private void SetupCommands()
138142
CommandPartMoveAllSelectedNode = new SimpleCommandWithParameter<MyPoint>(PartMoveAllSelectedNode);
139143
CommandZoom = new SimpleCommandWithParameter<object>(Zoom);
140144

145+
CommandLogDebug = new SimpleCommandWithParameter<string>(LogDebug);
146+
CommandLogError = new SimpleCommandWithParameter<string>(LogError);
147+
CommandLogInformation = new SimpleCommandWithParameter<string>(LogInformation);
148+
CommandLogWarning = new SimpleCommandWithParameter<string>(LogWarning);
149+
141150
//CommandAddConnect = new Command<ViewModelConnect, ViewModelConnect>(this, AddConnect, DeleteConnect);
142151
//CommandDeleteNode = new Command<MyPoint, ViewModelNode>(this, DeleteNode,);
143152
CommandSelect = new SimpleCommandWithParameter<MyPoint>(StartSelect);
@@ -360,7 +369,7 @@ private void ValidateNodeName(ValidateObjectProperty<ViewModelNode, string> obj)
360369
{
361370
if (!String.IsNullOrWhiteSpace(obj.Property))
362371
{
363-
if (!Nodes.Any(x => x.Name == obj.Property))
372+
if (!NodeExist(obj.Property))
364373
{
365374
obj.Obj.Name = obj.Property;
366375
}
@@ -370,12 +379,23 @@ private void ValidateConnectName(ValidateObjectProperty<ViewModelConnector, stri
370379
{
371380
if (!String.IsNullOrWhiteSpace(obj.Property))
372381
{
373-
if (!this.Nodes.Where(x=>x.Transitions.Any(x=>x.Name == obj.Property)).Any())
382+
if (!ConnectExist(obj.Property))
374383
{
375384
obj.Obj.Name = obj.Property;
376385
}
377386
}
378387
}
388+
private bool ConnectExist(string nameConnect)
389+
{
390+
var t = this.Nodes.SelectMany(x => x.Transitions);
391+
return this.Nodes.SelectMany(x=>x.Transitions).Any(x=>x.Name == nameConnect);
392+
}
393+
394+
private bool NodeExist(string nameNode)
395+
{
396+
return Nodes.Any(x => x.Name == nameNode);
397+
}
398+
379399
private void New()
380400
{
381401
this.Nodes.Clear();
@@ -384,39 +404,73 @@ private void New()
384404
this.SetupStartState();
385405
}
386406
private void Open(string fileName)
387-
{
407+
{
388408
this.Nodes.Clear();
389409
this.Connects.Clear();
410+
390411
XDocument xDocument = XDocument.Load(fileName);
391412
XElement stateMachineXElement = xDocument.Element("StateMachine");
392413
if(stateMachineXElement==null)
393414
{
394-
LogError("File is not correct");
395-
SetupStartState();
415+
Error("not contanins StateMachine");
396416
return;
397417
}
398-
var States = stateMachineXElement.Element("States")?.Elements()?.ToList();
399-
States?.ForEach(x => this.Nodes.Add(ViewModelNode.FromXElement(this, x)));
400-
var startState = stateMachineXElement.Element("StartState")?.Attribute("Name")?.Value;
401-
402-
if (string.IsNullOrEmpty(startState))
403-
this.SetupStartState();
404-
else
405-
this.SetAsStart(this.Nodes.Single(x => x.Name == startState));
406-
407-
var Transitions = stateMachineXElement.Element("Transitions")?.Elements()?.ToList();
418+
#region setup states/nodes
419+
420+
var States = stateMachineXElement.Element("States")?.Elements()?.ToList() ?? new List<XElement>();
421+
ViewModelNode viewModelNode = null;
422+
foreach (var state in States)
423+
{
424+
viewModelNode = ViewModelNode.FromXElement(this, state, out string errorMesage, NodeExist);
425+
if (WithError(errorMesage, x => Nodes.Add(x), viewModelNode))
426+
return;
427+
}
428+
429+
#region setup start state
430+
431+
var startState = stateMachineXElement.Element("StartState")?.Attribute("Name")?.Value;
432+
433+
if (string.IsNullOrEmpty(startState))
434+
this.SetupStartState();
435+
else
436+
this.SetAsStart(this.Nodes.Single(x => x.Name == startState));
437+
438+
#endregion setup start state
439+
440+
#endregion setup states/nodes
441+
442+
#region setup Transitions/connects
443+
444+
var Transitions = stateMachineXElement.Element("Transitions")?.Elements()?.ToList()??new List<XElement>();
408445
ViewModelConnect viewModelConnect;
409446
foreach (var transition in Transitions)
410447
{
448+
viewModelConnect = ViewModelConnector.FromXElement(this, transition, out string errorMesage, ConnectExist);
449+
if (WithError(errorMesage, x => Connects.Add(x), viewModelConnect))
450+
return;
451+
}
411452

412-
viewModelConnect = ViewModelConnector.FromXElement(this, transition);
413-
if (viewModelConnect != null)
453+
#endregion setup Transitions/connects
454+
455+
bool WithError<T>(string errorMessage, Action<T> action, T obj)
456+
{
457+
if(string.IsNullOrEmpty(errorMessage))
458+
{
459+
if(!object.Equals(obj,default(T)))
460+
action.Invoke(obj);
461+
}
462+
else
414463
{
415-
this.Connects.Add(viewModelConnect);
464+
Error(errorMessage);
465+
return true;
416466
}
467+
return false;
468+
}
469+
void Error(string errorMessage)
470+
{
471+
LogError("File is not valid: " + errorMessage);
472+
SetupStartState();
417473
}
418-
//Transitions?.ForEach(x => this.Connects.Add(ViewModelConnect.FromXElement(this, x)));
419-
420474
}
421475
private void Save(string fileName)
422476
{

0 commit comments

Comments
 (0)