X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FGUI%2FGUI.fs;h=c6e639069bde08c813f76c3eb525e31ab690430f;hp=6f11379679fe6e8400e68f69f5bef0dc0856f4de;hb=f4fdf61ef98b913129ddb771392c0bcb1475e6fb;hpb=0af5da4bffad8333c8e57851e067218c0e21d7bb diff --git a/Parasitemia/Parasitemia/GUI/GUI.fs b/Parasitemia/Parasitemia/GUI/GUI.fs index 6f11379..c6e6390 100644 --- a/Parasitemia/Parasitemia/GUI/GUI.fs +++ b/Parasitemia/Parasitemia/GUI/GUI.fs @@ -25,7 +25,8 @@ let run (defaultConfig: Config) = // Utils.log <- (fun m -> log mainWindow m) - let currentImageMargin = 0.1 // 10 %. + let colorRBCHealthy = Brushes.Green + let colorRBCInfected = Brushes.Yellow let state = State.State() @@ -53,8 +54,19 @@ let run (defaultConfig: Config) = canvasCurrentImage.Height <- float srcImg.img.Height canvasCurrentImage.Width <- float srcImg.img.Width canvasCurrentImage.Background <- ImageBrush(BitmapSourceConvert.ToBitmapSource(srcImg.img)) - (*for rbc in srcImg.rbcs do - let rectangle = Rectangle(Height = float rbc.size.Height, Width = float rbc.size.Width, )*) + + // Remove all image canvas children and add the RBC. + canvasCurrentImage.Children.Clear() + for rbc in (*srcImg.rbcs*) [{ num = 1; infected = true; addedManually = false; removed = false; center = Point(100., 100.); size = Size(40., 40.); stainArea = 10 }] do + let rectangle = + Rectangle( + Height = rbc.size.Height, + Width = rbc.size.Width, + Stroke = (if rbc.infected then colorRBCInfected else colorRBCHealthy), + StrokeThickness = 1.) + Canvas.SetLeft(rectangle, rbc.center.X + rbc.size.Width / 2.) + Canvas.SetTop(rectangle, rbc.center.Y + rbc.size.Height / 2.) + canvasCurrentImage.Children.Add(rectangle) |> ignore let addPreview (srcImg: SourceImage) = let imgCtrl = Views.ImageSourcePreview(Margin = Thickness(3.)) @@ -66,8 +78,11 @@ let run (defaultConfig: Config) = let updatePreviews () = stackPreviews.Children.Clear () - for srcImg in state.SourceImages do - addPreview srcImg + if state.SourceImages.Count() > 0 + then + for srcImg in state.SourceImages do + addPreview srcImg + setCurrentImage (state.SourceImages.First()) let updateGUI () = txtPatient.Text <- state.PatientID @@ -116,18 +131,37 @@ let run (defaultConfig: Config) = butStartAnalysis.Click.AddHandler(fun obj args -> ()) // Zoom on the current image. - let adjustCurrentImageMargins () = + let adjustCurrentImageBorders (deltaX: float) (deltaY: float) = borderCurrentImage.BorderThickness <- - Thickness(scrollViewCurrentImage.ViewportWidth / 2., scrollViewCurrentImage.ViewportHeight / 2., scrollViewCurrentImage.ViewportWidth / 2., scrollViewCurrentImage.ViewportHeight / 2.) - - scrollViewCurrentImage.Loaded.AddHandler(fun obj args -> adjustCurrentImageMargins ()) - scrollViewCurrentImage.SizeChanged.AddHandler(fun obj args -> adjustCurrentImageMargins ()) + Thickness( + (scrollViewCurrentImage.ViewportWidth + deltaX) / 2., + (scrollViewCurrentImage.ViewportHeight + deltaY) / 2., + (scrollViewCurrentImage.ViewportWidth + deltaX) / 2., + (scrollViewCurrentImage.ViewportHeight + deltaY) / 2.) + + canvasCurrentImage.SizeChanged.AddHandler(fun obj args -> + let deltaX = args.NewSize.Width - args.PreviousSize.Width + let deltaY = args.NewSize.Height - args.PreviousSize.Height + if deltaX > 0.5 || deltaY > 0.5 + then + adjustCurrentImageBorders 0.0 0.0 + // Center the view at the center of the image initialy. + scrollViewCurrentImage.UpdateLayout() + scrollViewCurrentImage.ScrollToHorizontalOffset(borderCurrentImage.ActualWidth / 2. - scrollViewCurrentImage.ViewportWidth / 2.) + scrollViewCurrentImage.ScrollToVerticalOffset(borderCurrentImage.ActualHeight / 2. - scrollViewCurrentImage.ViewportHeight / 2.)) + + scrollViewCurrentImage.SizeChanged.AddHandler(fun obj args -> + let deltaX = args.NewSize.Width - args.PreviousSize.Width + let deltaY = args.NewSize.Height - args.PreviousSize.Height + adjustCurrentImageBorders deltaX deltaY + scrollViewCurrentImage.ScrollToHorizontalOffset(scrollViewCurrentImage.HorizontalOffset + deltaX / 8.) + scrollViewCurrentImage.ScrollToVerticalOffset(scrollViewCurrentImage.VerticalOffset + deltaY / 8.)) let mutable currentScale = 1. let mutable maxScale = 5. let mutable minScale = 0.1 let currentImageScaleTransform = ScaleTransform() - borderCurrentImage.LayoutTransform <- currentImageScaleTransform + canvasCurrentImage.LayoutTransform <- currentImageScaleTransform borderCurrentImage.PreviewMouseWheel.AddHandler(fun obj args -> let scaleFactor = if args.Delta > 0 then 2.0 else 0.5 if scaleFactor > 1. && currentScale < maxScale || scaleFactor < 1. && currentScale > minScale @@ -138,15 +172,15 @@ let run (defaultConfig: Config) = if newScale > maxScale then maxScale elif newScale < minScale then minScale else newScale let realScaleFactor = currentScale / previousScale - let centerX = scrollViewCurrentImage.HorizontalOffset + scrollViewCurrentImage.ViewportWidth / 2. - canvasCurrentImage.Margin.Left - let centerY = scrollViewCurrentImage.VerticalOffset + scrollViewCurrentImage.ViewportHeight / 2. - canvasCurrentImage.Margin.Top + let centerX = scrollViewCurrentImage.HorizontalOffset + scrollViewCurrentImage.ViewportWidth / 2. - borderCurrentImage.BorderThickness.Left + let centerY = scrollViewCurrentImage.VerticalOffset + scrollViewCurrentImage.ViewportHeight / 2. - borderCurrentImage.BorderThickness.Top - canvasCurrentImage.Margin <- Thickness(canvasCurrentImage.Margin.Top * realScaleFactor) + //canvasCurrentImage.Margin <- Thickness(canvasCurrentImage.Margin.Top * realScaleFactor) currentImageScaleTransform.ScaleX <- currentScale currentImageScaleTransform.ScaleY <- currentScale - scrollViewCurrentImage.ScrollToHorizontalOffset(centerX * realScaleFactor - scrollViewCurrentImage.ViewportWidth / 2. + canvasCurrentImage.Margin.Left) - scrollViewCurrentImage.ScrollToVerticalOffset(centerY * realScaleFactor - scrollViewCurrentImage.ViewportHeight / 2. + canvasCurrentImage.Margin.Top) + scrollViewCurrentImage.ScrollToHorizontalOffset(centerX * realScaleFactor - scrollViewCurrentImage.ViewportWidth / 2. + borderCurrentImage.BorderThickness.Left) + scrollViewCurrentImage.ScrollToVerticalOffset(centerY * realScaleFactor - scrollViewCurrentImage.ViewportHeight / 2. + borderCurrentImage.BorderThickness.Top) args.Handled <- true) // Pan on the current image. @@ -178,14 +212,13 @@ let run (defaultConfig: Config) = borderCurrentImage.ReleaseMouseCapture() args.Handled <- true) - - (*let txtPatient: Controls.TextBox = ctrl "txtPatient" + (* let txtPatient: Controls.TextBox = ctrl "txtPatient" txtPatient.TextChanged.AddHandler(fun obj args -> - state.PatientID <- txtPatient.Text)*) + state.PatientID <- txtPatient.Text) *) - (*saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; + (* saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; saveFileDialog1.FilterIndex = 2 ; - saveFileDialog1.RestoreDirectory = true ;*) + saveFileDialog1.RestoreDirectory = true ; *) // display mainWindow img mainWindow.Root.Show()