private static ProgramFeatureImageViewModel FetchProgramFeatureViewModelForFlag <TFlag>(this TFlag flag, IProgramFeatureSet <TFlag> featureSet, bool allowNullImage) where TFlag : struct { ProgramFeatureImageViewModel featureViewModel = null; OSImage image = featureSet.GetImageForFeature(flag); if (allowNullImage || (image != null)) { featureViewModel = new ProgramFeatureImageViewModel(featureSet.GetFeatureName(flag), image, featureSet.GetFeatureDescription(flag), featureSet.Category, (uint)((object)flag)); } return(featureViewModel); }
/// <summary> /// Produces an enumerable containing icons and other data that represent all the given flags. /// </summary> /// <typeparam name="TFlag">The data type of the flag whose view models are desired.</typeparam> /// <param name="flags">The flags for which to retrieve view models.</param> /// <param name="featureSet">The feature set that provides detailed information about each flag.</param> /// <returns>An enumerable containing a view model for each flag specified in the flags argument.</returns> public static IEnumerable <ProgramFeatureImageViewModel> ToFeatureViewModels <TFlag>(this IEnumerable <TFlag> flags, IProgramFeatureSet <TFlag> featureSet) where TFlag : struct { var viewModels = new List <ProgramFeatureImageViewModel>(); foreach (var flag in flags) { viewModels.Add(FetchProgramFeatureViewModelForFlag(flag, featureSet, true)); } return(viewModels); }
private static List <ProgramFeatureImageViewModel> GetImagesForFlags <TFlag>(this TFlag flags, IProgramFeatureSet <TFlag> featureSet, CompatibilityCheckMode compatibilityCheck, ref bool hasIncompatibility) where TFlag : struct { var featureViewModels = new List <ProgramFeatureImageViewModel>(); var allFlags = Enum.GetValues(typeof(TFlag)).Cast <object>().Distinct().ToArray(); var currentFlags = (Enum)((object)flags); var setFlags = allFlags.Where(f => currentFlags.HasFlag((Enum)f)).Select(f => (TFlag)f); var featureCompatibility = ((FeatureCompatibility)(object)flags) & FeatureCompatibilityHelpers.ValidFeaturesMask; var incompatible = false; switch (compatibilityCheck) { case CompatibilityCheckMode.None: foreach (var flag in setFlags) { var image = flag.FetchProgramFeatureViewModelForFlag(featureSet, false); if (image != null) { featureViewModels.Add(image); } } break; case CompatibilityCheckMode.Default: incompatible = featureCompatibility == FeatureCompatibility.Incompatible; if (incompatible && featureSet.ExtendedFeaturesRequireEnhancedFlag) { var image = default(TFlag).FetchProgramFeatureViewModelForFlag(featureSet, false); if (image != null) { featureViewModels.Add(image); } } else { var image = ((TFlag)allFlags.GetValue((int)featureCompatibility)).FetchProgramFeatureViewModelForFlag(featureSet, false); if (image != null) { featureViewModels.Add(image); } if (!featureSet.ExtendedFeaturesRequireEnhancedFlag || featureCompatibility.HasFlag(FeatureCompatibility.Enhances)) { foreach (var flag in allFlags.Skip((int)FeatureCompatibility.NumCompatibilityModes)) { if (((Enum)(object)flags).HasFlag((Enum)flag)) { image = ((TFlag)flag).FetchProgramFeatureViewModelForFlag(featureSet, false); if (image != null) { featureViewModels.Add(image); } } } } } break; case CompatibilityCheckMode.OnlyCheckIncompatible: incompatible = featureCompatibility == FeatureCompatibility.Incompatible; if (incompatible) { var image = default(TFlag).FetchProgramFeatureViewModelForFlag(featureSet, false); if (image != null) { featureViewModels.Add(image); } } break; } hasIncompatibility |= incompatible; return(featureViewModels); }