protected override DriverResult Editor(ThemeSkinsPart part, dynamic shapeHelper)
 {
     return(ContentShape("Parts_ThemeSkinsPart_Edit",
                         () => {
         var vm = new ThemeSkinsPartEditViewModel();
         vm.SelectedSkinName = part.SkinName;
         PopulateVMOptions(vm);
         PopulateVMVariables(part, vm);
         return shapeHelper.EditorTemplate(
             TemplateName: "Parts/ThemeSkinsPart",
             Model: vm,
             Prefix: Prefix);
     }));
 }
        private void PopulateVMVariables(ThemeSkinsPart part, ThemeSkinsPartEditViewModel vm)
        {
            var variables = _themeSkinsService.GetSkinVariables();

            foreach (var savedVariable in part.Variables)
            {
                var fromTheme = variables.FirstOrDefault(v => v.Name.Equals(savedVariable.Name));
                if (fromTheme != null)
                {
                    fromTheme.Value = savedVariable.Value;
                }
            }
            vm.Variables = variables.ToArray();
        }
        protected override DriverResult Editor(ThemeSkinsPart part, IUpdateModel updater, dynamic shapeHelper)
        {
            var vm = new ThemeSkinsPartEditViewModel();

            if (updater.TryUpdateModel(vm, Prefix, null, null))
            {
                // TODO validate variables in the vm
                part.SkinName  = vm.SelectedSkinName;
                part.Variables = vm.Variables;
            }
            return(ContentShape("Parts_ThemeSkinsPart_Edit",
                                () => {
                PopulateVMOptions(vm);
                return shapeHelper.EditorTemplate(
                    TemplateName: "Parts/ThemeSkinsPart",
                    Model: vm,
                    Prefix: Prefix);
            }));
        }
        private void PopulateVMOptions(ThemeSkinsPartEditViewModel vm)
        {
            vm.AvailableSkinNames = _themeSkinsService.GetSkinNames();
            var options = new List <SelectListItem>();
            // the manifest may have a skin named Default, that would then be the one
            // that should be used when nothing is selected.
            var exclude     = new List <string>();
            var defaultSkin = vm.AvailableSkinNames.FirstOrDefault(s => s.Equals("default", StringComparison.OrdinalIgnoreCase));

            if (!string.IsNullOrWhiteSpace(defaultSkin))
            {
                options.Add(new SelectListItem {
                    Text     = defaultSkin,
                    Value    = defaultSkin,
                    Selected = string.IsNullOrWhiteSpace(vm.SelectedSkinName) ||
                               defaultSkin.Equals(vm.SelectedSkinName, StringComparison.OrdinalIgnoreCase)
                });
                exclude.Add(defaultSkin);
            }
            else
            {
                options.Add(new SelectListItem {
                    Text     = T("Default").Text,
                    Value    = string.Empty,
                    Selected = string.IsNullOrWhiteSpace(vm.SelectedSkinName)
                });
            }
            if (vm.AvailableSkinNames != null)
            {
                options.AddRange(vm.AvailableSkinNames
                                 .Except(exclude)
                                 .Select(x => new SelectListItem {
                    Text     = x,
                    Value    = x,
                    Selected = string.Equals(x, vm.SelectedSkinName)
                }));
            }
            vm.Options = options;
        }