module Parasitemia.GUI open System.IO open System.Windows open System.Windows.Media open System.Windows.Markup open System.Windows.Shapes open System.Windows.Controls open System.Drawing open System.Diagnostics open Microsoft.Win32 // For the common dialogs. //open Emgu.CV //open Emgu.CV.Structure open Emgu.CV.WPF open Config let run (defaultConfig: Config) = let app = new Application() let mainWindow = Views.MainWindow() let ctrl (name: string): 'a = mainWindow.Root.FindName(name) :?> 'a // Utils.log <- (fun m -> log mainWindow m) let state = State.State() let exit: MenuItem = ctrl "menuExit" let saveFile: MenuItem = ctrl "menuSave" let loadFile: MenuItem = ctrl "menuOpen" let newFile: MenuItem = ctrl "menuNew" let addSourceImage: MenuItem = ctrl "menuAddSourceImage" let txtPatient: TextBox = ctrl "txtPatient" let stackPreviews: StackPanel = ctrl "stackPreviews" let butStartAnalysis: Button = ctrl "butStartAnalysis" let synchronizeState () = state.PatientID <- txtPatient.Text let updatePreviews () = stackPreviews.Children.Clear () state.ImagesSource |> Seq.iteri (fun i imgSrc -> let imgCtrl = Views.ImageSourcePreview(Margin = Thickness(3.)) imgCtrl.lblImageNumber.Content <- i + 1 let width = 200 let height = imgSrc.img.Height * width / imgSrc.img.Width imgCtrl.imagePreview.Source <- BitmapSourceConvert.ToBitmapSource(imgSrc.img.Resize(width, height, Emgu.CV.CvEnum.Inter.Cubic)) stackPreviews.Children.Add(imgCtrl) |> ignore ) let updateGUI () = txtPatient.Text <- state.PatientID updatePreviews () exit.Click.AddHandler(fun obj args -> mainWindow.Root.Close()) saveFile.Click.AddHandler(fun obj args -> synchronizeState () if state.FilePath = "" then let dialog = SaveFileDialog(AddExtension = true, DefaultExt = Pia.extension, Filter = Pia.filter); let res = dialog.ShowDialog() if res.HasValue && res.Value then state.FilePath <- dialog.FileName state.Save() else state.Save()) loadFile.Click.AddHandler(fun obj args -> // TODO: if current state not saved and not empty, ask to save it. let dialog = OpenFileDialog(Filter = Pia.filter) let res = dialog.ShowDialog() if res.HasValue && res.Value then state.FilePath <- dialog.FileName state.Load() updateGUI ()) newFile.Click.AddHandler(fun obj args -> // TODO: if current state not saved and not empty, ask to save it. state.Reset() updateGUI()) addSourceImage.Click.AddHandler(fun obj args -> let dialog = OpenFileDialog(Filter = "Image Files|*.png;*.jpg;*.tif;*.tiff") let res = dialog.ShowDialog() if res.HasValue && res.Value then state.AddSourceImage(dialog.FileName) updatePreviews ()) butStartAnalysis.Click.AddHandler(fun obj args -> ()) (*let txtPatient: Controls.TextBox = ctrl "txtPatient" txtPatient.TextChanged.AddHandler(fun obj args -> state.PatientID <- txtPatient.Text)*) (*saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; saveFileDialog1.FilterIndex = 2 ; saveFileDialog1.RestoreDirectory = true ;*) // display mainWindow img mainWindow.Root.Show() app.Run()