8using System.Collections.Generic;
9using System.Threading.Tasks;
10using System.Windows.Controls;
11using System.Windows.Input;
26 private readonly List<TokenModel> tokens =
new();
27 private readonly List<TokenTotal> totals =
new();
33 private Control[] tokenMenuItems =
null;
35 private readonly
Command addTextNote;
36 private readonly
Command addXmlNote;
49 this.neuroFeaturesClient.TokenAdded += this.NeuroFeaturesClient_TokenAdded;
50 this.neuroFeaturesClient.TokenRemoved += this.NeuroFeaturesClient_TokenRemoved;
52 this.neuroFeaturesClient.StateUpdated += this.NeuroFeaturesClient_StateUpdated;
53 this.neuroFeaturesClient.VariablesUpdated += this.NeuroFeaturesClient_VariablesUpdated;
55 this.addTextNote =
new Command(this.CanExecuteAddNote, this.ExecuteAddTextNote);
56 this.addXmlNote =
new Command(this.CanExecuteAddNote, this.ExecuteAddXmlNote);
59 private Task NeuroFeaturesClient_TokenAdded(
object Sender,
TokenEventArgs e)
64 Token.Selected +=
this.Token_Selected;
65 Token.Deselected +=
this.Token_Deselected;
66 Token.NoteAdded +=
this.Token_NoteAdded;
70 this.tokens.Insert(0,
Token);
75 Task _ = this.LoadTotals();
78 return Task.CompletedTask;
81 private void Token_NoteAdded(
object sender, EventArgs e)
86 private void Token_Deselected(
object sender, EventArgs e)
88 if (this.selectedItem == sender)
90 this.selectedItem =
null;
96 this.tokenMenuItems =
null;
101 private async
void Token_Selected(
object sender, EventArgs e)
108 bool PrepareMenuItems =
true;
110 if (this.selectedItem is not
null)
112 string TokenId = this.selectedItem.
TokenId;
114 if (this.selectedItem.
CurrentState is
null ||
this.selectedItem.CurrentVariables is
null)
116 await this.neuroFeaturesClient.GetCurrentState(TokenId, async (sender2, e2) =>
118 if (e2.Ok &&
this.selectedItem is not
null &&
this.selectedItem.TokenId == TokenId)
120 PrepareMenuItems = false;
122 this.selectedItem.StateUpdated(e2.CurrentState);
123 this.selectedItem.VariablesUpdated(e2.Variables);
124 await this.selectedItem.UpdateNoteCommands();
126 MainWindow.UpdateGui(async () =>
128 await this.PrepareTokenMenuItems();
137 if (PrepareMenuItems)
138 await this.PrepareTokenMenuItems();
146 private void LoadEvents()
149 this.RaisePropertyChanged(nameof(this.Events));
151 this.neuroFeaturesClient.GetEvents(this.selectedItem.
TokenId, 0, 100, (sender, e) =>
153 if (e.Ok && e.Events.Length > 0 && e.Events[0].TokenId == (string)e.State)
155 int i, c = e.Events.Length;
156 TokenEventDetail[] Events = new TokenEventDetail[c];
158 for (i = 0; i < c; i++)
159 Events[i] = TokenEventDetail.Create(e.Events[i]);
161 this.events = Events;
163 MainWindow.UpdateGui(() =>
165 this.RaisePropertyChanged(nameof(this.Events));
166 return Task.CompletedTask;
170 return Task.CompletedTask;
174 private async Task PrepareTokenMenuItems()
176 List<Control> Items =
new();
179 if (
Model is not
null)
181 Items.Add(
new MenuItem()
183 Header =
"Add Text Note...",
187 Items.Add(
new MenuItem()
189 Header =
"Add XML Note...",
193 Items.Add(
new Separator());
195 Items.Add(
new MenuItem()
197 Header =
"Present State...",
198 Command = Model.ViewPresentReport
201 Items.Add(
new MenuItem()
203 Header =
"History...",
204 Command = Model.ViewHistoryReport
207 Items.Add(
new MenuItem()
209 Header =
"State Diagram...",
210 Command = Model.ViewStateDiagramReport
213 Items.Add(
new MenuItem()
215 Header =
"Profiling...",
216 Command = Model.ViewProfilingReport
219 KeyValuePair<NoteCommand, int>[] Commands = await
Model.GetContextSpecificNoteCommands(
true);
221 if (Commands.Length > 0)
223 Items.Add(
new Separator());
225 foreach (KeyValuePair<NoteCommand, int> P
in Commands)
230 Items.Add(
new MenuItem()
232 Header =
Command.Title?.Find(
"en"),
233 ToolTip =
Command.ToolTip?.Find(
"en"),
241 this.tokenMenuItems = Items.ToArray();
242 this.RaisePropertyChanged(nameof(this.TokenMenuItems));
245 private Task NeuroFeaturesClient_TokenRemoved(
object Sender,
TokenEventArgs e)
251 int i, c = this.tokens.Count;
253 for (i = 0; i < c; i++)
257 this.tokens.RemoveAt(i);
263 this.RaisePropertyChanged(nameof(this.Tokens));
265 Task _ = this.LoadTotals();
267 return Task.CompletedTask;
270 return Task.CompletedTask;
276 this.neuroFeaturesClient.Dispose();
287 public IEnumerable<TokenModel> Tokens
293 return this.tokens.ToArray();
303 get => this.selectedItem;
304 set => this.selectedItem = value;
315 public Control[] TokenMenuItems => this.tokenMenuItems;
317 public IEnumerable<TokenTotal> Totals
323 return this.totals.ToArray();
328 private async Task LoadTotals()
338 this.totals.AddRange(e.
Totals);
341 this.RaisePropertyChanged(nameof(this.Totals));
353 public ICommand AddTextNote => this.addTextNote;
358 public ICommand AddXmlNote => this.addXmlNote;
360 private bool CanExecuteAddNote()
362 return this.selectedItem is not
null;
365 private async Task ExecuteAddTextNote()
369 if (!
string.IsNullOrEmpty(s))
371 if (this.selectedItem is
null)
377 await this.neuroFeaturesClient.AddTextNoteAsync(this.selectedItem.
TokenId, s);
388 private async Task ExecuteAddXmlNote()
390 string s =
string.Empty;
395 if (
string.IsNullOrEmpty(s))
400 if (this.selectedItem is
null)
406 await this.neuroFeaturesClient.AddXmlNoteAsync(this.selectedItem.
TokenId, s);
421 MainWindow.currentInstance.TokensTab.DataContext =
this;
422 return Task.CompletedTask;
425 await this.LoadTotals();
430 TokensEventArgs e2 = await this.neuroFeaturesClient.GetTokensAsync(Offset, c);
436 TokenModel.Selected += this.Token_Selected;
437 TokenModel.Deselected += this.Token_Deselected;
438 TokenModel.NoteAdded += this.Token_NoteAdded;
446 this.RaisePropertyChanged(nameof(this.Tokens));
448 Offset += e2.
Tokens.Length;
449 if (e2.
Tokens.Length == 0)
452 e2 = await this.neuroFeaturesClient.GetTokensAsync(Offset, c);
468 Token.VariablesUpdated(e.Variables);
469 await Token.UpdateNoteCommands();
471 if (this.selectedItem?.Token.TokenId == e.TokenId)
473 await this.PrepareTokenMenuItems();
478 foreach (
object Control
in MainWindow.currentInstance.TabControl.Items)
480 if (Control is not TabItem Tab)
483 if (Tab.Content is not ReportTab ReportTab)
486 if (ReportTab.Report.TokenId != e.TokenId)
489 await ReportTab.Report.OnVariablesUpdated(Sender, e);
498 return Task.CompletedTask;
501 private Task NeuroFeaturesClient_StateUpdated(
object Sender,
NewStateEventArgs e)
511 Token.StateUpdated(e.NewState);
512 await Token.UpdateNoteCommands();
514 if (this.selectedItem?.Token.TokenId == e.TokenId)
515 await this.PrepareTokenMenuItems();
519 foreach (
object Control
in MainWindow.currentInstance.TabControl.Items)
521 if (Control is not TabItem Tab)
524 if (Tab.Content is not ReportTab ReportTab)
527 if (ReportTab.Report.TokenId != e.TokenId)
530 await ReportTab.Report.OnNewState(Sender, e);
539 return Task.CompletedTask;
Interaction logic for MainWindow.xaml
static void ErrorBox(string ErrorMessage)
Displays an error message on the screen, on the main UI thread.
static string PromptUser(string Title, string Label)
Prompts the user for input.
static DesignModel DesignModel
Design model
static void UpdateGui(GuiDelegate Method)
Calls a method from the Main UI thread.
Defines a custom command.
Abstract base class for view models
virtual void RaisePropertyChanged(string PropertyName)
Raises the PropertyChanged event.
Abstract base class for persistant view models
Contains information about a token event.
string TokenId
ID of token
string CurrentState
Current state of state-machine (if known).
TokensModel(XmppClient Client, ContractsClient Contracts, string ComponentJid)
Tokens Model
IEnumerable< TokenModel > Tokens
Account events
TokenModel SelectedItem
Selected item
Control[] TokenMenuItems
Context-menu items for selected token.
override async Task Start()
Starts the model.
TokenEventDetail[] Events
Events of selected item.
NeuroFeaturesClient NeuroFeaturesClient
Neuro-Features client
Event arguments events when the current state of a state-machine has changed.
Event arguments for token events.
Event arguments to totals response callback methods.
TokenTotal[] Totals
Token totals, per currency.
Event arguments for Tokens responses
Event arguments events when the variables of a state-machine has changed.
Information about a note command related to the state-machine associated with the token.
Helps with common XML-related tasks.
static bool IsValidXml(string Xml)
Checks if a string is valid XML
Static class managing the application event log. Applications and services log events on this static ...
static void Exception(Exception Exception, string Object, string Actor, string EventId, EventLevel Level, string Facility, string Module, params KeyValuePair< string, object >[] Tags)
Logs an exception. Event type will be determined by the severity of the exception.
Adds support for legal identities, smart contracts and signatures to an XMPP client.
bool Ok
If the response is an OK result response (true), or an error response (false).
Manages an XMPP client connection. Implements XMPP, as defined in https://tools.ietf....