Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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");
        }