private void DeleteFromDatabase(DiagramItem wholeDiagramToAdjust, SelectableDesignerItemViewModelBase itemToDelete) { if (itemToDelete is BatteryViewModel) { DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(BatteryDesignerItem)); wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent); _databaseAccessService.DeleteDesignerItem<BatteryDesignerItem>(itemToDelete.Id); } if (itemToDelete is ResistorViewModel) { DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(ResistorDesignerItem)); wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent); _databaseAccessService.DeleteDesignerItem<ResistorDesignerItem>(itemToDelete.Id); } if (itemToDelete is LightBulbViewModel) { DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(LightBulbDesignerItem)); wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent); _databaseAccessService.DeleteDesignerItem<LightBulbDesignerItem>(itemToDelete.Id); } if (itemToDelete is SwitchViewModel) { DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(SwitchDesignerItem)); wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent); _databaseAccessService.DeleteDesignerItem<SwitchDesignerItem>(itemToDelete.Id); } if (itemToDelete is VoltmeterViewModel) { DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(VoltmeterDesignerItem)); wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent); _databaseAccessService.DeleteDesignerItem<VoltmeterDesignerItem>(itemToDelete.Id); } if (itemToDelete is AmmeterViewModel) { DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(AmmeterDesignerItem)); wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent); _databaseAccessService.DeleteDesignerItem<AmmeterDesignerItem>(itemToDelete.Id); } if (itemToDelete is ConnectorViewModel) { wholeDiagramToAdjust.ConnectionIds.Remove(itemToDelete.Id); _databaseAccessService.DeleteConnection(itemToDelete.Id); } _databaseAccessService.SaveDiagram(wholeDiagramToAdjust); }
private void ExecuteSaveDiagramCommand(object parameter) { if (!DiagramViewModel.Items.Any()) { MessageBox.Show("There is nothing to save!", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } IsBusy = true; DiagramItem wholeDiagramToSave; Task<int> task = Task.Factory.StartNew(() => { if (SavedDiagramId != null) { int currentSavedDiagramId = SavedDiagramId.Value; wholeDiagramToSave = _databaseAccessService.FetchDiagram(currentSavedDiagramId); //Clear all removed items that the user deleted as part of this work sesssion foreach (var itemToRemove in _itemsToRemove) { DeleteFromDatabase(wholeDiagramToSave, itemToRemove); } // Start with empty collections of connections and items, which will be populated based on current diagram wholeDiagramToSave.ConnectionIds = new List<int>(); wholeDiagramToSave.DesignerItems = new List<DiagramItemData>(); } else { wholeDiagramToSave = new DiagramItem(); } // Ensure that itemsToRemove is cleared ready for any new changes within a session _itemsToRemove = new List<SelectableDesignerItemViewModelBase>(); foreach (var model in DiagramViewModel.Items.OfType<BatteryViewModel>()) { BatteryDesignerItem item = new BatteryDesignerItem(model.Id, model.Left, model.Top, model.Component.VoltageSource); model.Id = _databaseAccessService.SaveDesignerItem(item); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(BatteryDesignerItem))); } foreach (var model in DiagramViewModel.Items.OfType<ResistorViewModel>()) { ResistorDesignerItem item = new ResistorDesignerItem(model.Id, model.Left, model.Top, model.Component.Resistance); model.Id = _databaseAccessService.SaveDesignerItem(item); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(ResistorDesignerItem))); } foreach (var model in DiagramViewModel.Items.OfType<LightBulbViewModel>()) { LightBulbDesignerItem item = new LightBulbDesignerItem(model.Id, model.Left, model.Top, model.Component.Resistance); model.Id = _databaseAccessService.SaveDesignerItem(item); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(LightBulbDesignerItem))); } foreach (var model in DiagramViewModel.Items.OfType<SwitchViewModel>()) { bool isOn = model.Component.Resistance < 1; SwitchDesignerItem item = new SwitchDesignerItem(model.Id, model.Left, model.Top, isOn); model.Id = _databaseAccessService.SaveDesignerItem(item); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(SwitchDesignerItem))); } foreach (var model in DiagramViewModel.Items.OfType<VoltmeterViewModel>()) { VoltmeterDesignerItem item = new VoltmeterDesignerItem(model.Id, model.Left, model.Top); model.Id = _databaseAccessService.SaveDesignerItem(item); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(VoltmeterDesignerItem))); } foreach (var model in DiagramViewModel.Items.OfType<AmmeterViewModel>()) { AmmeterDesignerItem item = new AmmeterDesignerItem(model.Id, model.Left, model.Top); model.Id = _databaseAccessService.SaveDesignerItem(item); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(AmmeterDesignerItem))); } //Save all connections which should now have their Connection.DataItems filled in with correct Ids foreach (var model in DiagramViewModel.Items.OfType<ConnectorViewModel>()) { FullyCreatedConnectorInfo sinkConnector = model.SinkConnectorInfo as FullyCreatedConnectorInfo; Connection connection = new Connection( model.Id, model.SourceConnectorInfo.DataItem.Id, GetOrientationFromConnector(model.SourceConnectorInfo.Orientation), GetTypeOfDiagramItem(model.SourceConnectorInfo.DataItem), sinkConnector.DataItem.Id, GetOrientationFromConnector(sinkConnector.Orientation), GetTypeOfDiagramItem(sinkConnector.DataItem)); model.Id = _databaseAccessService.SaveConnection(connection); wholeDiagramToSave.ConnectionIds.Add(model.Id); } wholeDiagramToSave.Id = _databaseAccessService.SaveDiagram(wholeDiagramToSave); return wholeDiagramToSave.Id; }); task.ContinueWith(ant => { int wholeDiagramToSaveId = ant.Result; if (!_savedDiagrams.Contains(wholeDiagramToSaveId)) { List<int> newDiagrams = new List<int>(_savedDiagrams) {wholeDiagramToSaveId}; SavedDiagrams = newDiagrams; } IsBusy = false; MessageBox.Show("Circuit \"" + wholeDiagramToSaveId + "\" saved successfully.", "Save", MessageBoxButton.OK, MessageBoxImage.Information); }, TaskContinuationOptions.OnlyOnRanToCompletion); }