aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2018-10-04 14:56:36 +0300
committerAvi Levkovich <avi@twine-s.com>2018-10-04 14:56:36 +0300
commit632378c43fea445b5ce0808eabc8d02a97a7a387 (patch)
tree0f71a85552f944875da567d0dc391ed981138305 /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
parent5461fa6ed66e087ea3cc582af39a733e1a1202c2 (diff)
parent141b450771f7e98b93eca9492e0cbe800da13e1f (diff)
downloadTango-632378c43fea445b5ce0808eabc8d02a97a7a387.tar.gz
Tango-632378c43fea445b5ce0808eabc8d02a97a7a387.zip
merge conflict
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs')
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs430
1 files changed, 367 insertions, 63 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
index 5f439e1ca..2ca5aa43b 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
@@ -33,6 +33,8 @@ using Tango.MachineStudio.Common;
using Tango.Core.Commands;
using Tango.MachineStudio.Technician.Helpers;
using Tango.MachineStudio.Technician.Models;
+using Tango.Logging;
+using Microsoft.WindowsAPICodePack.Dialogs;
namespace Tango.MachineStudio.Technician.ViewModels
{
@@ -55,20 +57,46 @@ namespace Tango.MachineStudio.Technician.ViewModels
private const int MIN_DIAGNOSTICS_UPDATE_MILI = 500;
private TechnicianModuleSettings _settings;
- private List<SingleTechRecordingData<SingleGraphItem>> _single_graphs_recordings;
- private List<MultiTechRecordingData<MultiGraphItem>> _multi_graph_recordings;
+ private List<SingleTechRecordingData> _single_graphs_recordings;
+ private List<MultiTechRecordingData> _multi_graph_recordings;
+ private List<SingleTechRecordingData> _single_monitors_recordings;
+ private List<MultiTechRecordingData> _multi_monitors_recordings;
#region Properties
- private ObservableCollection<IElementEditor> _elements;
+ private ObservableCollection<MachineTechTabVM> _tabs;
/// <summary>
- /// Gets or sets the visual elements.
+ /// Gets or sets the elements tabs.
/// </summary>
- public ObservableCollection<IElementEditor> Elements
+ public ObservableCollection<MachineTechTabVM> Tabs
{
- get { return _elements; }
- set { _elements = value; RaisePropertyChangedAuto(); }
+ get { return _tabs; }
+ set { _tabs = value; RaisePropertyChangedAuto(); }
+ }
+
+ private MachineTechTabVM _selectedTab;
+ /// <summary>
+ /// Gets or sets the selected tab.
+ /// </summary>
+ public MachineTechTabVM SelectedTab
+ {
+ get { return _selectedTab; }
+ set
+ {
+ _selectedTab = value;
+ RaisePropertyChangedAuto();
+
+ foreach (var tab in Tabs.Where(x => x != _selectedTab))
+ {
+ tab.IsSelected = false;
+ }
+
+ if (_selectedTab != null)
+ {
+ _selectedTab.IsSelected = true;
+ }
+ }
}
private ObservableCollection<TechItem> _availableTechItems;
@@ -210,8 +238,30 @@ namespace Tango.MachineStudio.Technician.ViewModels
/// </summary>
public RelayCommand ResetHardwareConfigurationCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the update graphs duration command.
+ /// </summary>
public RelayCommand UpdateGraphsDurationCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the add tab command.
+ /// </summary>
+ public RelayCommand AddTabCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the remove tab command.
+ /// </summary>
+ public RelayCommand<MachineTechTabVM> RemoveTabCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the new project command.
+ /// </summary>
+ public RelayCommand NewProjectCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the rename tab command.
+ /// </summary>
+ public RelayCommand RenameTabCommand { get; set; }
#endregion
#region Constructors
@@ -223,10 +273,17 @@ namespace Tango.MachineStudio.Technician.ViewModels
/// <param name="notificationProvider">The notification provider.</param>
public MachineTechViewVM(IStudioApplicationManager applicationManager, INotificationProvider notificationProvider, IDiagnosticsFrameProvider diagnosticsFrameProvider, IEventLogger eventLogger)
{
+ Tabs = new ObservableCollection<MachineTechTabVM>();
+ Tabs.Add(new MachineTechTabVM() { IsSelected = true, Name = "Untitled" });
+ SelectedTab = Tabs.First();
+
_settings = SettingsManager.Default.GetOrCreate<TechnicianModuleSettings>();
- _single_graphs_recordings = new List<SingleTechRecordingData<SingleGraphItem>>();
- _multi_graph_recordings = new List<MultiTechRecordingData<MultiGraphItem>>();
+ _single_graphs_recordings = new List<SingleTechRecordingData>();
+ _multi_graph_recordings = new List<MultiTechRecordingData>();
+
+ _single_monitors_recordings = new List<SingleTechRecordingData>();
+ _multi_monitors_recordings = new List<MultiTechRecordingData>();
GraphsDurationSeconds = _settings.GraphsDuration;
TempGraphsDurationSeconds = GraphsDurationSeconds;
@@ -242,7 +299,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
ApplicationManager.ConnectedMachineChanged += ApplicationManager_ConnectedMachineChanged;
Adapter = ObservablesStaticCollections.Instance;
- Elements = new ObservableCollection<IElementEditor>();
OpenProjectCommand = new RelayCommand(OpenProject);
SaveAsProjectCommand = new RelayCommand(SaveAsProject);
@@ -274,6 +330,11 @@ namespace Tango.MachineStudio.Technician.ViewModels
_settings.GraphsDuration = GraphsDurationSeconds;
ClearAllGraphs();
});
+
+ AddTabCommand = new RelayCommand(() => AddNewTab());
+ RemoveTabCommand = new RelayCommand<MachineTechTabVM>(RemoveTab);
+ NewProjectCommand = new RelayCommand(CreateNewProject);
+ RenameTabCommand = new RelayCommand(RenameTab);
}
#endregion
@@ -322,10 +383,35 @@ namespace Tango.MachineStudio.Technician.ViewModels
CurrentDiagnosticsResponseSize = data.CalculateSize();
}
+ foreach (var sr in _single_monitors_recordings)
+ {
+ var techMonitor = (sr.Tag as TechMonitor);
+
+ var prop = _diagnoticsMonitorsDataProperties.SingleOrDefault(x => x.Name == techMonitor.Name);
+
+ if (prop != null)
+ {
+ var points = GetDataArray(techMonitor, prop.GetValue(data.Monitors));
+ sr.PushData(points);
+ }
+ }
+
+ foreach (var mr in _multi_monitors_recordings)
+ {
+ var techMonitor = (mr.Tag as TechMonitor);
+
+ var prop = _diagnoticsMonitorsDataProperties.SingleOrDefault(x => x.Name == techMonitor.Name);
+
+ if (prop != null)
+ {
+ var points = GetDataMatrix(techMonitor, prop.GetValue(data.Monitors));
+ mr.PushData(points);
+ }
+ }
lock (_elementsLock)
{
- var elements = Elements.ToList();
+ var elements = Tabs.SelectMany(x => x.Elements).ToList();
foreach (var item in elements.Select(x => x.HostedElement as TechItem))
{
@@ -380,7 +466,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
controller.PushData(points);
- var _graph_recording = _single_graphs_recordings.SingleOrDefault(x => x.TechItem == graphItem);
+ var _graph_recording = _single_graphs_recordings.SingleOrDefault(x => x.Tag == graphItem);
if (_graph_recording != null)
{
_graph_recording.PushData(points);
@@ -414,7 +500,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
controller.PushData(points);
- var _graph_recording = _multi_graph_recordings.SingleOrDefault(x => x.TechItem == graphItem);
+ var _graph_recording = _multi_graph_recordings.SingleOrDefault(x => x.Tag == graphItem);
if (_graph_recording != null)
{
_graph_recording.PushData(points);
@@ -455,6 +541,15 @@ namespace Tango.MachineStudio.Technician.ViewModels
heaterItem.HeaterState = heaterState;
}
}
+ else if (item.GetType() == typeof(BlowerItem))
+ {
+ BlowerItem blowerItem = item as BlowerItem;
+
+ if (data.Monitors.BlowerVoltage.Count > 0)
+ {
+ blowerItem.EffectiveActive = data.Monitors.BlowerVoltage.Last() > 0;
+ }
+ }
else if (item.GetType() == typeof(ControllerItem))
{
ControllerItem controllerItem = item as ControllerItem;
@@ -635,7 +730,8 @@ namespace Tango.MachineStudio.Technician.ViewModels
}
else if (item is BlowerItem)
{
- CreateElement<BlowerElementEditor, BlowerItem, HardwareBlowerType>(bounds, Adapter.HardwareBlowerTypes.FirstOrDefault());
+ var editor = CreateElement<BlowerElementEditor, BlowerItem, HardwareBlowerType>(bounds, Adapter.HardwareBlowerTypes.FirstOrDefault());
+ InitBlowerItem(editor.BlowerItem);
}
else if (item is BreakSensorItem)
{
@@ -655,6 +751,11 @@ namespace Tango.MachineStudio.Technician.ViewModels
{
CreateElement<TextElementEditor, TextItem, object>(bounds, null);
}
+ else if (item is MonitorRecorderItem)
+ {
+ var editor = CreateElement<MonitorRecorderElementEditor, MonitorRecorderItem, object>(bounds, null);
+ InitMonitorRecorderItem(editor.MonitorRecorderItem);
+ }
}
/// <summary>
@@ -670,7 +771,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
{
TechItem item = Activator.CreateInstance(typeof(Tech), new object[] { value }) as TechItem;
IElementEditor editor = Activator.CreateInstance(typeof(Editor), new object[] { ((Tech)item), bounds }) as IElementEditor;
- Elements.Add(editor);
+ SelectedTab.Elements.Add(editor);
return (Editor)editor;
}
@@ -683,7 +784,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
private Editor CreateElement<Editor>(TechItem item) where Editor : IElementEditor
{
IElementEditor editor = Activator.CreateInstance(typeof(Editor), new object[] { item, item.GetBounds() }) as IElementEditor;
- Elements.Add(editor);
+ SelectedTab.Elements.Add(editor);
return (Editor)editor;
}
@@ -782,7 +883,8 @@ namespace Tango.MachineStudio.Technician.ViewModels
else if (item is BlowerItem)
{
(item as BlowerItem).HardwareBlowerType = Adapter.HardwareBlowerTypes.FirstOrDefault(x => x.Guid == item.ItemGuid);
- CreateElement<BlowerElementEditor>(item);
+ var editor = CreateElement<BlowerElementEditor>(item);
+ InitBlowerItem(editor.BlowerItem);
}
else if (item is BreakSensorItem)
{
@@ -803,6 +905,10 @@ namespace Tango.MachineStudio.Technician.ViewModels
{
CreateElement<TextElementEditor>(item);
}
+ else if (item is MonitorRecorderItem)
+ {
+ CreateElement<MonitorRecorderElementEditor>(item);
+ }
}
/// <summary>
@@ -815,20 +921,24 @@ namespace Tango.MachineStudio.Technician.ViewModels
{
if (element.HostedElement is SingleGraphItem)
{
- var _graph_recording = _single_graphs_recordings.SingleOrDefault(x => x.TechItem == element.HostedElement);
+ var _graph_recording = _single_graphs_recordings.SingleOrDefault(x => x.Tag == element.HostedElement);
if (_graph_recording != null)
{
+ (_graph_recording.Tag as SingleGraphItem).StopRecording();
_single_graphs_recordings.Remove(_graph_recording);
+ _graph_recording.Dispose();
}
}
else if (element.HostedElement is MultiGraphItem)
{
- var _graph_recording = _multi_graph_recordings.SingleOrDefault(x => x.TechItem == element.HostedElement);
+ var _graph_recording = _multi_graph_recordings.SingleOrDefault(x => x.Tag == element.HostedElement);
if (_graph_recording != null)
{
+ (_graph_recording.Tag as MultiGraphItem).StopRecording();
_multi_graph_recordings.Remove(_graph_recording);
+ _graph_recording.Dispose();
}
}
}
@@ -915,6 +1025,71 @@ namespace Tango.MachineStudio.Technician.ViewModels
#region Init Tech Items
+ private void InitMonitorRecorderItem(MonitorRecorderItem item)
+ {
+ item.RecordingStarted += () =>
+ {
+ CommonOpenFileDialog dlg = new CommonOpenFileDialog();
+ dlg.Title = "Select a folder to place all CSV files.";
+ dlg.IsFolderPicker = true;
+ if (dlg.ShowDialog() == CommonFileDialogResult.Ok)
+ {
+ foreach (var monitor in item.GetSelectedMonitors())
+ {
+ if (!monitor.MultiChannel)
+ {
+ _single_monitors_recordings.Add(new SingleTechRecordingData(monitor.Name, dlg.FileName + "\\" + monitor.Description + ".csv") { Tag = monitor });
+ }
+ else
+ {
+ _multi_monitors_recordings.Add(new MultiTechRecordingData(monitor.Name, monitor.ChannelCount, dlg.FileName + "\\" + monitor.Description + ".csv") { Tag = monitor });
+ }
+ item.StartRecording();
+ }
+ }
+ };
+
+ item.RecordingStopped += () =>
+ {
+ item.StopRecording();
+
+ foreach (var sr in _single_monitors_recordings)
+ {
+ sr.Dispose();
+ }
+
+ _single_monitors_recordings.Clear();
+
+ foreach (var mr in _multi_monitors_recordings)
+ {
+ mr.Dispose();
+ }
+
+ _multi_monitors_recordings.Clear();
+ };
+ }
+
+ /// <summary>
+ /// Initializes the blower item.
+ /// </summary>
+ /// <param name="item">The blower item.</param>
+ private void InitBlowerItem(BlowerItem item)
+ {
+ item.SetCommandClicked += async (_, isActive) =>
+ {
+ try
+ {
+ CheckMachineOperator();
+ await MachineOperator.SetBlowerState((PMR.Hardware.HardwareBlowerType)item.HardwareBlower.HardwareBlowerType.Code, isActive, item.HardwareBlower.Voltage);
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, $"Error executing SetBlowerState command for blower {item.HardwareBlower.HardwareBlowerType.Name}.");
+ _eventLogger.Log(ex, $"Error executing SetBlowerState command for blower {item.HardwareBlower.HardwareBlowerType.Name}.");
+ }
+ };
+ }
+
/// <summary>
/// Initializes the tech heater.
/// </summary>
@@ -1135,29 +1310,30 @@ namespace Tango.MachineStudio.Technician.ViewModels
item.RecordingStarted += () =>
{
- _single_graphs_recordings.Add(new SingleTechRecordingData<SingleGraphItem>(item));
+ SaveFileDialog dlg = new SaveFileDialog();
+ dlg.Title = "Save graph data as csv file";
+ dlg.Filter = "CSV Files|*.csv";
+ dlg.DefaultExt = ".csv";
+ dlg.FileName = item.TechName;
+ if (dlg.ShowDialog().Value)
+ {
+ _single_graphs_recordings.Add(new SingleTechRecordingData(item.TechName, dlg.FileName) { Tag = item });
+ item.StartRecording();
+ }
};
item.RecordingStopped += () =>
{
try
{
- var graph_recording = _single_graphs_recordings.SingleOrDefault(x => x.TechItem == item);
+ item.StopRecording();
+
+ var graph_recording = _single_graphs_recordings.SingleOrDefault(x => x.Tag == item);
if (graph_recording != null)
{
_single_graphs_recordings.Remove(graph_recording);
-
- SaveFileDialog dlg = new SaveFileDialog();
- dlg.Title = "Save graph data as csv file";
- dlg.Filter = "CSV Files|*.csv";
- dlg.DefaultExt = ".csv";
- dlg.FileName = item.TechName;
- if (dlg.ShowDialog().Value)
- {
- graph_recording.Save(dlg.FileName);
- graph_recording.Dispose();
- }
+ graph_recording.Dispose();
}
}
catch (Exception ex)
@@ -1195,29 +1371,30 @@ namespace Tango.MachineStudio.Technician.ViewModels
item.RecordingStarted += () =>
{
- _multi_graph_recordings.Add(new MultiTechRecordingData<MultiGraphItem>(item, item.TechMonitor.ChannelCount));
+ SaveFileDialog dlg = new SaveFileDialog();
+ dlg.Title = "Save graph data as csv file";
+ dlg.Filter = "CSV Files|*.csv";
+ dlg.DefaultExt = ".csv";
+ dlg.FileName = item.TechName;
+ if (dlg.ShowDialog().Value)
+ {
+ _multi_graph_recordings.Add(new MultiTechRecordingData(item.TechName, item.TechMonitor.ChannelCount, dlg.FileName) { Tag = item });
+ item.StartRecording();
+ }
};
item.RecordingStopped += () =>
{
try
{
- var graph_recording = _multi_graph_recordings.SingleOrDefault(x => x.TechItem == item);
+ item.StopRecording();
+
+ var graph_recording = _multi_graph_recordings.SingleOrDefault(x => x.Tag == item);
if (graph_recording != null)
{
_multi_graph_recordings.Remove(graph_recording);
-
- SaveFileDialog dlg = new SaveFileDialog();
- dlg.Title = "Save graph data as csv file";
- dlg.Filter = "CSV Files|*.csv";
- dlg.DefaultExt = ".csv";
- dlg.FileName = item.TechName;
- if (dlg.ShowDialog().Value)
- {
- graph_recording.Save(dlg.FileName);
- graph_recording.Dispose();
- }
+ graph_recording.Dispose();
}
}
catch (Exception ex)
@@ -1377,7 +1554,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
/// <param name="item">The controller item.</param>
private void InitControllerItem(ControllerItem item)
{
- item.ValueChanged += async (x, value) =>
+ item.SetCommandClicked += async (_, __) =>
{
try
{
@@ -1385,7 +1562,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
await MachineOperator.SetComponentValue(new SetComponentValueRequest()
{
Component = (ValueComponent)item.TechController.Code,
- Value = value
+ Value = item.Value
});
}
catch (Exception ex)
@@ -1488,7 +1665,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
#endregion
- #region Public Methods
+ #region Project Management
/// <summary>
/// Opens a file open dialog to select a project file.
@@ -1511,8 +1688,31 @@ namespace Tango.MachineStudio.Technician.ViewModels
/// <param name="fileName">File path.</param>
public void OpenProjectFile(String fileName)
{
- LoadProject(MachineTechViewProject.Load(fileName));
- _lastTechProjectFile = fileName;
+ try
+ {
+ MachineTechViewProject project = null;
+
+ project = MachineTechViewProject.Load(fileName);
+
+ if (project.Tabs.Count == 0)
+ {
+ LogManager.Log($"Error loading project file {fileName}. Trying to load using legacy project loader.", LogCategory.Warning);
+
+ MachineTechViewProjectTab tab = new MachineTechViewProjectTab();
+ tab.Name = "Untitled";
+ tab.Items.AddRange(project.Items);
+ project.Items.Clear();
+ project.Tabs.Add(tab);
+ }
+
+ LoadProject(project);
+ _lastTechProjectFile = fileName;
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, $"Error loading project file {fileName}.");
+ _notification.ShowError("An error occurred while trying to load the tech board project file.");
+ }
}
/// <summary>
@@ -1523,19 +1723,30 @@ namespace Tango.MachineStudio.Technician.ViewModels
{
using (_notification.PushTaskItem("Loading technician project file..."))
{
- Elements.Clear();
+ Tabs.Clear();
_singleControllers.Clear();
_multiControllers.Clear();
- foreach (var item in project.Items)
+ foreach (var tab in project.Tabs)
{
- if (item is MotorGroupItem)
+ MachineTechTabVM t = new MachineTechTabVM();
+ t.Name = tab.Name;
+ Tabs.Add(t);
+
+ SelectedTab = t;
+
+ foreach (var item in tab.Items)
{
- (item as MotorGroupItem).TechMotors = ObservablesStaticCollections.Instance.HardwareMotorTypes.Where(x => (item as MotorGroupItem).ItemsGuids.Contains(x.Guid)).ToObservableCollection();
- }
+ if (item is MotorGroupItem)
+ {
+ (item as MotorGroupItem).TechMotors = ObservablesStaticCollections.Instance.HardwareMotorTypes.Where(x => (item as MotorGroupItem).ItemsGuids.Contains(x.Guid)).ToObservableCollection();
+ }
- AddTechItem(item);
+ AddTechItem(item);
+ }
}
+
+ SelectedTab = Tabs.ElementAt(project.SelectedTabIndex);
}
}
@@ -1590,22 +1801,115 @@ namespace Tango.MachineStudio.Technician.ViewModels
private MachineTechViewProject GenerateProjectFile()
{
MachineTechViewProject project = new MachineTechViewProject();
+ project.SelectedTabIndex = Tabs.IndexOf(SelectedTab);
- foreach (var element in Elements)
+ foreach (var tab in Tabs)
{
- if (element.HostedElement is MotorGroupItem)
+ MachineTechViewProjectTab pTab = new MachineTechViewProjectTab();
+ pTab.Name = tab.Name;
+
+ foreach (var element in tab.Elements)
{
- var group = element.HostedElement as MotorGroupItem;
- group.ItemsGuids = group.TechMotors.Select(x => x.Guid).ToList();
+ if (element.HostedElement is MotorGroupItem)
+ {
+ var group = element.HostedElement as MotorGroupItem;
+ group.ItemsGuids = group.TechMotors.Select(x => x.Guid).ToList();
+ }
+
+ (element.HostedElement as TechItem).SetBounds(element.GetBounds());
+ pTab.Items.Add(element.HostedElement as TechItem);
}
- (element.HostedElement as TechItem).SetBounds(element.GetBounds());
- project.Items.Add(element.HostedElement as TechItem);
+ project.Tabs.Add(pTab);
}
return project;
}
+ /// <summary>
+ /// Removes the specified tab.
+ /// </summary>
+ /// <param name="tab">The tab.</param>
+ private void RemoveTab(MachineTechTabVM tab)
+ {
+ if (_notification.ShowQuestion("Are you sure you want to delete the selected tab?"))
+ {
+ Tabs.Remove(tab);
+ SelectedTab = Tabs.LastOrDefault();
+
+ if (SelectedTab == null)
+ {
+ AddNewTab("Untitled");
+ }
+ }
+ }
+
+ /// <summary>
+ /// Adds a new tab.
+ /// </summary>
+ private bool AddNewTab(String name = null)
+ {
+ if (Tabs.Count > 7)
+ {
+ _notification.ShowError("Cannot exceed the maximum number of 8 tabs. You can remove a tab, or create a new project.");
+ return false;
+ }
+
+ if (name == null)
+ {
+ name = _notification.ShowTextInput("Enter tab name", "Tab Name", "Untitled");
+ }
+
+ if (!String.IsNullOrWhiteSpace(name))
+ {
+ MachineTechTabVM t = new MachineTechTabVM();
+ t.Name = name;
+ Tabs.Add(t);
+ SelectedTab = t;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new project.
+ /// </summary>
+ private void CreateNewProject()
+ {
+ var to_remove = Tabs.ToList();
+
+ if (AddNewTab())
+ {
+ _singleControllers.Clear();
+ _multiControllers.Clear();
+
+ foreach (var tab in to_remove)
+ {
+ Tabs.Remove(tab);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Renames the tab.
+ /// </summary>
+ /// <param name="tab">The tab.</param>
+ private void RenameTab()
+ {
+ if (SelectedTab != null)
+ {
+ var name = _notification.ShowTextInput("Enter tab name", "Tab Name", SelectedTab.Name);
+
+ if (!String.IsNullOrWhiteSpace(name))
+ {
+ SelectedTab.Name = name;
+ }
+ }
+ }
+
#endregion
#region IStudioModuleVM
@@ -1641,7 +1945,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
private void SyncHardwareConfiguration()
{
- var elements = Elements.ToList();
+ var elements = Tabs.SelectMany(x => x.Elements).ToList();
if (MachineOperator != null && MachineOperator.CurrentHardwareConfiguration != null)
{