Dzięki po raz kolejny :)
Zastosowałem się do porad. Dodałem instancję jako pole do presentera. Zmieniłem też parę rzeczy. Do ConvertProperties dodałem tak jak pisałeś właściwość ISizingMode. Teraz wygląda to tak :
public class ImageConvertProperties
{
public ISizingMode SizingMode
{
get
{
return CreateSizingMode();
}
}
ISizingMode CreateSizingMode()
{
ISizingMode sMode;
if(ratioMode)
{
sMode = new RatioMode(ratio);
}
else
{
sMode = new FixedSizeMode(width,height);
}
return sMode;
}
/* reszta kodu ... */
}
Teraz w klasie ImageConverter robię po prostu coś takiego :
private Image ConvertImage(Image sourceImage, ImageConvertProperties properties)
{
Image converted;
Size size = properties.SizingMode.GetNewSize(sourceImage.Width,sourceImage.Height);
converted = new Bitmap(size.Width,size.Height);
using (Graphics g = Graphics.FromImage(converted))
{
g.InterpolationMode = properties.interpolationMode;
g.SmoothingMode = properties.smoothingMode;
g.CompositingQuality = properties.compositionQuality;
g.DrawImage(sourceImage, 0, 0, size.Width, size.Height);
}
return converted;
}
Poza tym wywaliłem całkowicie metodę z 'And' i dodałem wszystko do taska czyli :
Task.Factory.StartNew(()=>{
for (int i = 0; i < imagesPaths.Length && !cancelTask.IsCancellationRequested; i++)
{
Image loadedImage = LoadImage(imagesPaths[i]);
Image convertedImage = ConvertImage(loadedImage, convertProperties);
string savePath = CreateSavePath(imagesPaths[i],
convertProperties.destonationPath,
convertProperties.imageFormat);
SaveImage(convertedImage, savePath);
if(ConvertingProgressChanged != null)
ConvertingProgressChanged(i/(double)imagesPaths.Length);
}
if(ConvertingComplete != null)
ConvertingComplete();
});
Ogólnie kod porozbijał się na mniejsze części i nawet łatwiej się w tym orientować :)
Do kodu chciałbym jeszcze dodać pytanie o to, co zrobić gdy plik o podanej nazwie istnieje. Planuję zrobić coś takiego :
Do ImageConverter dodać delegata który i event w stylu NameConflict(string name) i enum (CopyAndReplace,Replace,Ignore). Enum byłby wartością zwracaną zdarzenia. Event zarejestrować w presenter i odpalać jakiegoś Form'a . Z From pobierać enuma i zwracać go z metody presentera która jest zarejestrowana w zdarzeniu. Czy tak będzie dobrze ?
Pozdr.
Astrocyt