module Parasitemia.GUI.Analysis open System open System.Windows open System.Windows.Media open System.Windows.Markup open System.Windows.Shapes open System.Windows.Controls open Config let showWindow (parent: Window) (state: State.State) (defaultConfig: Config) : bool = let window = Views.AnalysisWindow() window.Root.Owner <- parent window.Root.Left <- parent.Left + parent.ActualWidth / 2. - window.Root.Width / 2. window.Root.Top <- parent.Top + parent.ActualHeight / 2. - window.Root.Height / 2. let ctrl (name: string): 'a = window.Root.FindName(name) :?> 'a let butClose: Button = ctrl "butClose" let butStart: Button = ctrl "butStart" let progressBar: ProgressBar = ctrl "progress" let textLog: TextBlock = ctrl "textLog" let scrollLog: ScrollViewer = ctrl "scrollLog" Utils.log <- (fun mess -> window.Root.Dispatcher.Invoke(fun () -> textLog.Inlines.Add(Documents.Run(mess)) textLog.Inlines.Add(Documents.LineBreak()) scrollLog.ScrollToBottom())) let monitor = Object() let mutable analysisPerformed = false let mutable analysisCancelled = false butClose.Click.AddHandler(fun obj args -> window.Root.Close()) butStart.Click.AddHandler(fun obj args -> butStart.IsEnabled <- false butClose.Content <- "Abort" async { let results = ImageAnalysis.doMultipleAnalysis (state.SourceImages |> Seq.map (fun srcImg -> string srcImg.num, srcImg.img) |> Seq.toList) defaultConfig (Some (fun progress -> window.Root.Dispatcher.Invoke(fun () -> progressBar.Value <- float progress))) lock monitor ( fun() -> if not analysisCancelled then for id, rbcRadius, cells in results do state.SetResult (int id) rbcRadius cells window.Root.Dispatcher.Invoke(fun () -> butStart.IsEnabled <- false butClose.Content <- "Close") Utils.log "Analysis terminated successfully" analysisPerformed <- true) } |> Async.Start) window.Root.ShowDialog() |> ignore lock monitor (fun () -> if not analysisPerformed then analysisCancelled <- true analysisPerformed) (*let results = ImageAnalysis.doMultipleAnalysis (state.SourceImages |> Seq.map (fun srcImg -> string srcImg.num, srcImg.img) |> Seq.toList) defaultConfig for id, rbcRadius, cells in results do state.SetResult (int id) rbcRadius cells*)