public static Scene ApplyTemplate(this Scene scene, CmsEntities db, Scene templateScene) { // delete all walls on obsolete scene foreach (var wall in scene.Walls.ToList()) { db.Walls.Remove(wall); } // clone walls from template scene into our scene foreach (var wall in templateScene.Walls) { scene.Walls.Add(wall.Clone()); } return scene; }
public virtual Scene Clone() { var scene = new Scene { Id = 0, OwnerGuidId = this.OwnerGuidId, OwnerIntId = this.OwnerIntId, OwnerLongId = this.OwnerLongId, }; foreach (var wall in this.Walls) { scene.Walls.Add(wall.Clone()); } return scene; }
public ActionResult Save(Scene scene) { if (ModelState.IsValid) { // ensure walls collection is not null var walls = scene.Walls ?? new List<Wall>(); // get moved bricks var movedBricks = (from wall in walls from brick in wall.Bricks where wall.Id != brick.WallId && brick.Id != 0 select brick.Id).ToList(); // update existing walls foreach (var wall in walls.Where(w => w.Id != 0)) { var realWall = db.Walls.First(w => w.Id == wall.Id); realWall.Order = wall.Order; realWall.Width = wall.Width; // determine bricks removed from given wall var bricksToRemove = realWall.Bricks .Select(b => b.Id) .Except(movedBricks) .Except(wall.Bricks.Select(b => b.Id)) .ToList(); foreach (var bid in bricksToRemove) { db.Bricks.Remove(db.Bricks.First(b => b.Id == bid)); } // add new bricks foreach (var brick in wall.Bricks.Where(b => b.Id == 0).ToList()) { realWall.Bricks.Add(brick); } // updated bricks foreach (var brick in wall.Bricks.Where(b => (b.Id != 0) && (!movedBricks.Contains(b.Id)))) { ApplyCommonBrickValues(brick); } // moved bricks foreach (var brick in wall.Bricks.Where(b => movedBricks.Contains(b.Id))) { var realBrick = ApplyCommonBrickValues(brick); realWall.Bricks.Add(realBrick); } } // add new walls foreach (var wall in walls.Where(w => w.Id == 0)) { // moved bricks foreach (var brick in wall.Bricks.Where(b => movedBricks.Contains(b.Id)).ToList()) { wall.Bricks.Remove(brick); var realBrick = ApplyCommonBrickValues(brick); wall.Bricks.Add(realBrick); } wall.SceneId = scene.Id; db.Walls.Add(wall); } // remove walls foreach (var realWall in db.Walls.Where(w => w.SceneId == scene.Id).ToList()) { var ids = walls.Where(w => w.Id != 0).Select(w => w.Id).ToList(); if (!ids.Contains(realWall.Id)) { foreach(var brick in realWall.Bricks.ToList()) { db.Bricks.Remove(brick); } db.Walls.Remove(realWall); } } db.SaveChanges(); } if (Request.IsAjaxRequest()) { // render real (saved) scene return PartialView("~/WebExtracted/Ms.Cms/Views/Scene/DesignScene.cshtml", db.Scenes.First(s => s.Id == scene.Id)); } return View("~/WebExtracted/Ms.Cms/Views/Scene/DesignScene.cshtml"); }