示例#1
0
        public async Task <IActionResult> Index(ImageSetViewModel viewModel)
        {
            viewModel.AllSets = await db.ImageSets.ToListAsync();

            if (viewModel.ValidationErrors == null)
            {
                viewModel.ValidationErrors = new List <string>();
            }
            return(View(viewModel));
        }
        private static void ApplyFilter(ImageSetViewModel sender)
        {
            var targetViewModel = sender?.SelectedImageTypeTarget;

            ApplyFilter(targetViewModel);
        }
        private static void ManifestDesignerUserControl_Loaded(object sender)
        {
            var imageSetViewModel = _imageSetViewModel = (ImageSetViewModel)Exposed.From(sender).imageSetViewModel;

            if (imageSetViewModel == null)
            {
                return;
            }

            var visualAssetsControl = (FrameworkElement)Exposed.From(sender).visualAssetsControl;

            if (!visualAssetsControl.IsLoaded)
            {
                visualAssetsControl.Loaded -= VisualAssetsControl_Loaded;
                visualAssetsControl.Loaded += VisualAssetsControl_Loaded;
            }

            var imageSetModel = Exposed.From(sender).imageSetModel;

            var imageSetTargetViewModels = (IList <ImageSetTargetViewModel>)imageSetViewModel.ImageTypeTargets;

            _imageSetTarget = (ImageSetTarget)imageSetModel.Root;

            var imageGenerator = Exposed.From(imageSetModel).imageGenerator;

            if (imageGenerator.GetType().Name == "IImageGeneratorProxy")
            {
                return;
            }

            var imageGeneratorInterface = typeof(IImageConstraint).Assembly
                                          .GetTypes()
                                          .First(x => x.Name == "IImageGenerator");

            var imageGeneratorProxy = new ProxyGenerator().CreateInterfaceProxyWithTarget(imageGeneratorInterface,
                                                                                          imageGenerator,
                                                                                          new ImageGeneratorInterceptor());

            var imageGeneratorField = typeof(ImageSetModel).GetField("imageGenerator", BindingFlags.Instance | BindingFlags.NonPublic);

            imageGeneratorField.SetValue(imageSetModel, imageGeneratorProxy);

            var filePicker = (IFilePicker)Exposed.From(imageSetModel).filePicker;

            if (filePicker.GetType().Name == "IFilePickerProxy")
            {
                return;
            }

            imageSetTargetViewModels.Single(x => x.ImageType == null).PropertyChanged += ImageSetTargetViewModel_PropertyChanged;
            imageSetViewModel.PropertyChanged += ImageSetViewModel_PropertyChanged;

            var proxy = (IFilePicker) new ProxyGenerator().CreateInterfaceProxyWithTarget(typeof(IFilePicker),
                                                                                          filePicker,
                                                                                          new DialogFilterInterceptor());

            var filePickerField = typeof(ImageSetModel).GetField("filePicker", BindingFlags.Instance | BindingFlags.NonPublic);

            if (filePickerField == null)
            {
                return;
            }

            filePickerField.SetValue(imageSetModel, proxy);

            var imageReaderFactory = Exposed.From(imageGenerator).imageReaderFactory;

            if (!(Exposed.From(imageReaderFactory).imageReaders is IDictionary readers))
            {
                return;
            }

            var formatsToAdd = MagickImageReader.SupportedFormats
                               .Except(readers.Keys.OfType <string>())
                               .ToArray();

            if (formatsToAdd.Any())
            {
                var type = typeof(IImageConstraint).Assembly
                           .GetTypes()
                           .First(x => x.Name == "IImageReader");                         //.GetType($"{assembly.GetName().Name}.IImageReader");


                var wrapper = DelegateWrapper.WrapAs((Func <string, IEnumerable <IImageConstraint>, Task <Image> >)MagickImageReader.LoadAsync,
                                                     (Func <string, IEnumerable <IImageConstraint>, Task <Stream> >)MagickImageReader.LoadStreamAsync,
                                                     (Func <IEnumerable <string> >)(() => formatsToAdd),
                                                     new DelegateWrapper.MethodByNameAndEnumReturnType("get_ImageGraphicsType", "ImageGraphicsType", "Vector"),
                                                     type);

                foreach (var format in formatsToAdd)
                {
                    readers.Add(format, wrapper);
                }
            }

            var imageReaderFactoryField = Exposed.From(imageSetTargetViewModels.First()).previewImageLoader
                                          ?.GetType()
                                          .GetField("imageReaderFactory", BindingFlags.Instance | BindingFlags.NonPublic);

            if (imageReaderFactoryField == null)
            {
                return;
            }

            foreach (var imageSetTargetViewModel in imageSetTargetViewModels)
            {
                var exposedModel       = Exposed.From(imageSetTargetViewModel);
                var previewImageLoader = exposedModel.previewImageLoader;
                imageReaderFactoryField.SetValue(previewImageLoader, imageReaderFactory);
                if (!string.IsNullOrEmpty(exposedModel.SourceText) &&
                    formatsToAdd.Any(x => x.Equals(Path.GetExtension(exposedModel.SourceText), StringComparison.InvariantCultureIgnoreCase)) &&
                    exposedModel.SourceImage == null)
                {
                    ((UserControl)sender).Dispatcher.InvokeAsync(() => exposedModel.UpdateImagePreviewAsync());
                }
            }
        }
示例#4
0
        public async Task <IActionResult> AddImageSet(ImageSetViewModel viewModel)
        {
            viewModel.ValidationErrors = new List <string>();
            var results = new List <ValidationResult>();
            var context = new ValidationContext(viewModel);

            if (!Validator.TryValidateObject(viewModel, context, results, true))
            {
                foreach (var error in results)
                {
                    viewModel.ValidationErrors.Add(error.ErrorMessage);
                }
                return(RedirectToAction("Index", viewModel));
            }

            if (!viewModel.IsCyrContains && !viewModel.IsLatContains && !viewModel.IsNumContains)
            {
                viewModel.ValidationErrors.Add("Нужно выбрать одно из: 'Содержит кириллицу', 'Содержит латиницу', 'Содержит цифры'");
                return(RedirectToAction("Index", viewModel));
            }

            if (viewModel.Archive == null)
            {
                viewModel.ValidationErrors.Add("Загрука файла обязательна");
                return(RedirectToAction("Index", viewModel));
            }

            var    fileName = viewModel.Archive.FileName;
            string fileExt  = fileName.Substring(fileName.LastIndexOf('.'));

            if (fileExt != ".zip")
            {
                viewModel.ValidationErrors.Add("Можно загрузить только zip архив");
                return(RedirectToAction("Index", viewModel));
            }

            var        path       = $"{_appEnvironment.WebRootPath}/files/{fileName}";
            FileStream fileStream = new FileStream(path, FileMode.Create);

            viewModel.Archive.CopyTo(fileStream);
            fileStream.Close();

            var reader = new ZipReader();

            if (!reader.IsZipArchive(path))
            {
                viewModel.ValidationErrors.Add("Файл не является zip архивом");
                return(RedirectToAction("Index", viewModel));
            }

            var zipList    = reader.GetFileList(path);
            var imageCount = zipList.Count;

            if (viewModel.AnswersLocation == "InDetachedFile")
            {
                imageCount -= 1;
            }

            var minCount = 2000;
            var maxCount = 3000;

            if (viewModel.IsCyrContains)
            {
                minCount += 3000;
                maxCount += 3000;
            }
            if (viewModel.IsLatContains)
            {
                minCount += 3000;
                maxCount += 3000;
            }
            if (viewModel.IsNumContains)
            {
                minCount += 3000;
                maxCount += 3000;
            }
            if (viewModel.IsScharContains)
            {
                minCount += 3000;
                maxCount += 3000;
            }
            if (viewModel.IsCaseSens)
            {
                minCount += 3000;
                maxCount += 3000;
            }
            if (imageCount < minCount || imageCount > maxCount)
            {
                viewModel.ValidationErrors.Add($"При данных настройках архив может содержать от {minCount} до {maxCount} картинок");
                return(RedirectToAction("Index", viewModel));
            }

            if (viewModel.AnswersLocation == "InDetachedFile" && !zipList.Contains("answers.txt"))
            {
                viewModel.ValidationErrors.Add("В архиве отсутствует файл с ответами");
                return(RedirectToAction("Index", viewModel));
            }

            if (viewModel.AnswersLocation == "InDetachedFile")
            {
                var errorsList = reader.ValidateAnswersFile(path, imageCount);
                if (errorsList.Count > 0)
                {
                    viewModel.ValidationErrors.AddRange(errorsList);
                    return(RedirectToAction("Index", viewModel));
                }
            }

            var imageSet = new ImageSet
            {
                Title           = viewModel.Title,
                IsCyrContains   = viewModel.IsCyrContains,
                IsLatContains   = viewModel.IsLatContains,
                IsNumContains   = viewModel.IsNumContains,
                IsScharContains = viewModel.IsScharContains,
                IsCaseSens      = viewModel.IsCaseSens,
                AnswersLocation = viewModel.AnswersLocation,
                ArchivePath     = path,
                CreateDate      = DateTime.Now
            };

            db.ImageSets.Add(imageSet);
            await db.SaveChangesAsync();

            return(RedirectToAction("Index"));
        }