Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 14.11 KB | None | 0 0
  1. #load "textEdLwc.fsx"
  2.  
  3. open System.Windows.Forms
  4. open System.Drawing
  5.  
  6. open TextEdLwc
  7.  
  8. // Riprendo il bottone implementato a lezione
  9. type PIButton() =
  10.   inherit LWControl()
  11.  
  12.   let mutable text = ""
  13.  
  14.   member this.SetText str =
  15.     text <- str
  16.     str
  17.  
  18.   member this.Text
  19.     with get() = text
  20.     and set(v) = text <- v
  21.  
  22.   override this.OnPaint e =
  23.     let parent = this.Parent
  24.     let g = e.Graphics
  25.     let r = RectangleF(this.Position, this.Size) |> RectF2Rect
  26.     g.DrawRectangle(Pens.Red, r)
  27.     let ssz = g.MeasureString(text, parent.Font)
  28.     let p = this.Position
  29.     let sz = this.Size
  30.     let sx, sy = p.X + (sz.Width - ssz.Width) / 2.f, p.Y + (sz.Height - ssz.Height) / 2.f
  31.     g.DrawString(text, parent.Font, Brushes.Red, PointF(sx, sy))
  32.  
  33. // Istanzio la lista di font
  34. let FontArray = ResizeArray<Font>()
  35. FontArray.Add(new Font(FontFamily.GenericSansSerif, 16.0f))
  36. FontArray.Add(new Font(FontFamily.GenericSerif, 16.0f))
  37.  
  38. let mutable curFontIndex = 0
  39.  
  40. let transformPoint (m:Drawing2D.Matrix) (p:PointF) =
  41.     let pts = [| p |]
  42.     m.TransformPoints(pts)
  43.     pts.[0]
  44.  
  45.  
  46. // Funzione per trovare il font della dimensione adatta
  47. let FindFont (g : Graphics) (str : string) (box : SizeF) (preferredfont : Font) =
  48.   let stringsize = g.MeasureString(str, preferredfont)
  49.   let scaleRatio = min (box.Height / stringsize.Height) (box.Width / stringsize.Width)
  50.   let scalefontsize = scaleRatio * preferredfont.Size
  51.   new Font(preferredfont.FontFamily, float32 scalefontsize)
  52.  
  53. type PIGlyph(lf:Font) =
  54.   inherit LWControl()
  55.   let mutable letter = 'A'
  56.   let mutable letterSize = 12.0f
  57.   let mutable drag = None
  58.   let letterfont = lf
  59.  
  60.   member this.Drag
  61.     with get() = drag
  62.     and set(v) = drag <- v
  63.   member this.Lettera
  64.     with get() = letter
  65.     and set(v) = letter <- v
  66.    
  67.   member this.LetterSize
  68.     with get() = letterSize
  69.     and set(v) = letterSize <- v
  70.  
  71.   override this.OnPaint e =
  72.     let parent = this.Parent
  73.     let g = e.Graphics
  74.     let t = g.Transform
  75.     let r = RectangleF(this.Position, this.Size) |> RectF2Rect
  76.     // Creo la nuova vista
  77.     let newt = g.Transform
  78.     newt.RotateAt(-this.Angle, PointF(this.Position.X + this.Size.Width /2.f, this.Position.Y + this.Size.Height /2.f))
  79.     g.Transform <- newt
  80.  
  81.     g.DrawRectangle(Pens.DarkGreen, r)
  82.  
  83.     let fittingfont = FindFont g (string letter) this.Size letterfont
  84.     let ssz = g.MeasureString(string letter, fittingfont)
  85.     let p = this.Position
  86.     let sz = this.Size
  87.     let sx, sy = p.X + (sz.Width - ssz.Width) / 2.f, p.Y + (sz.Height - ssz.Height) / 2.f
  88.     g.DrawString(string letter, fittingfont, Brushes.Black, PointF(sx, sy))
  89.  
  90.     // Ripristino le coordinate
  91.     g.Transform <- t
  92.  
  93.   override this.HitTest p e=
  94.  
  95.     let prodottoScalare (p1 : PointF) (p2 : PointF) =
  96.       p1.X * p2.X + p1.Y * p2.Y
  97.     let gradiARadianti (a: float) =
  98.       a * System.Math.PI / float 180
  99.     let puntoRuotato (p : PointF) (c : PointF) (ang : float32) =
  100.       let a = float32 (gradiARadianti (float ang))
  101.       let xr = (cos a) * (p.X - c.X) - (sin a) * (p.Y -  c.Y) + c.X
  102.       let yr = (sin a) * (p.X - c.X) + (cos a) * (p.Y -  c.Y) + c.Y
  103.       PointF(xr, yr)
  104.     let differenzaVettoriale (p1 : PointF) (p2 : PointF) =
  105.       PointF(p2.X - p1.X, p2.Y - p1.Y)
  106.    
  107.     // Trovo i vertici del rettangolo dritto:
  108.     let A, B, C, D = this.Position, this.Position + SizeF(this.Size.Width, 0.f), this.Position + this.Size, this.Position + SizeF(0.f, this.Size.Height)
  109.     // Trovo i vertici ruotati
  110.     let c = this.Position + SizeF(this.Size.Width/2.f, this.Size.Height/2.f)
  111.     let A1, B1, C1, D1 = (puntoRuotato A c -this.Angle), (puntoRuotato B c -this.Angle), (puntoRuotato C c -this.Angle), (puntoRuotato D c -this.Angle)
  112.     let M = PointF(float32 p.X, float32  p.Y)
  113.     // Calcolo i vettori necessari
  114.     let AM, AB, AD = differenzaVettoriale A1 M, differenzaVettoriale A1 B1, differenzaVettoriale A1 D1
  115.    
  116.     // Calcolo i prodotti scalari
  117.     let AMAB, ABAB, AMAD, ADAD = (prodottoScalare AM AB), (prodottoScalare AB AB), (prodottoScalare AM AD), (prodottoScalare AD AD)
  118.  
  119.     // Controllo la posizione
  120.     0.f < AMAB && AMAB < ABAB && 0.f < AMAD && AMAD < ADAD
  121.  
  122.   (* // METODO BASATO SUI TRIANGOLI
  123.     let gradiARadianti (a: float) =
  124.       a * System.Math.PI / float 180
  125.     let puntoRuotato (p : PointF) (c : PointF) (ang : float32) =
  126.       let a = float32 (gradiARadianti (float ang))
  127.       let xr = (cos a) * (p.X - c.X) - (sin a) * (p.Y -  c.Y) + c.X
  128.       let yr = (sin a) * (p.X - c.X) + (cos a) * (p.Y -  c.Y) + c.Y
  129.       PointF(xr, yr)
  130.     let sign (p1: PointF) (p2: PointF) (p3: PointF) =
  131.       (p1.X - p3.X) * (p2.Y - p3.Y) - (p2.X - p3.X) * (p1.Y - p3.Y)
  132.     let puntoInTriangolo (pt: PointF) (v1: PointF) (v2: PointF) (v3: PointF) =
  133.       let b1 = ((sign pt v1 v2) < 0.0f)
  134.       let b2 = ((sign pt v2 v3) < 0.0f)
  135.       let b3 = ((sign pt v3 v1) < 0.0f)
  136.  
  137.       b1 = b2 && b2 = b3
  138.    
  139.     // Calcolo i vertici del rettangolo ruotato
  140.     // Vertici originali
  141.    
  142.     let A, B, C, D = this.Position, this.Position + SizeF(this.Size.Width, 0.f), this.Position + this.Size, this.Position + SizeF(0.f, this.Size.Height)
  143.     let c = this.Position + SizeF(this.Size.Width/2.f, this.Size.Height/2.f)
  144.     // Vertici ruotati
  145.     let A1, B1, C1, D1 = (puntoRuotato A c -this.Angle), (puntoRuotato B c -this.Angle), (puntoRuotato C c -this.Angle), (puntoRuotato D c -this.Angle)
  146.    
  147.     let M = PointF(float32 e.X, float32  e.Y)
  148.  
  149.     // Controllo se il punto cade in uno de due triangoli
  150.     (puntoInTriangolo M A1 B1 C1) || (puntoInTriangolo M A1 D1 C1)
  151. *)
  152.  
  153.  
  154.   override this.OnMouseDown e =
  155.     let parent = this.Parent
  156.     match parent with
  157.       | :? LWContainer as par ->
  158.         let mp = transformPoint par.Transformations.V2W (PointF(single(e.X), single(e.Y)))
  159.         drag <- Some (mp.X - this.Position.X, mp.Y - this.Position.Y)
  160.       | _ -> ()
  161.  
  162.   override this.OnMouseMove e =
  163.     let parent = this.Parent
  164.     match parent with
  165.       | :? LWContainer as par ->
  166.         let mp = transformPoint par.Transformations.V2W (PointF(single(e.X), single(e.Y)))
  167.         match drag with
  168.           | Some (dx, dy) ->
  169.             this.Position <- PointF(mp.X - dx, mp.Y - dy)
  170.             this.Parent.Invalidate()
  171.           | None -> ()
  172.       | _ -> ()
  173.  
  174.   override this.OnMouseUp e =
  175.     drag <- None
  176.  
  177. // Creo la form contenente i controlli
  178. let fin = new Form()
  179.  
  180. // Implemento il container
  181. let container = new LWContainer(Dock=DockStyle.Fill)
  182. fin.Controls.Add(container)
  183. let addLwc2Container (container:LWContainer) (contr:LWControl) =
  184.   contr.Parent <- container
  185.   container.LWControls.Add(contr)
  186.  
  187. // Dichiarazioni per il calcolo della posizione dei controlli
  188. let buttonPadding = 2
  189. let buttonSide = 30
  190. let btnNumberToPosition num =
  191.   let xpos = buttonPadding + (num % 3)*(buttonSide + buttonPadding)
  192.   let ypos = buttonPadding + (num / 3)*(buttonSide + buttonPadding)
  193.   PointF(float32 xpos,  float32 ypos)
  194.  
  195. let squaredBtnSize side =
  196.   SizeF(float32 side, float32 side)
  197. let mutable letteraSelezionata : string = "A"
  198.  
  199. let startScrolling dir _ =
  200.   container.ScrollDir <- dir
  201.   container.ScrollTimer.Start()
  202.  
  203. let startRotating dir _ =
  204.   container.RotateDir <- dir
  205.   container.RotateTimer.Start()
  206.  
  207. let startScaling dir _ =
  208.   container.ScaleDir <- dir
  209.   container.ScaleTimer.Start()
  210.  
  211. let fontUp (display : PIButton ) _ =
  212.   curFontIndex <- (curFontIndex + 1) % FontArray.Count
  213.   display.Text <- string curFontIndex
  214.   container.Invalidate()
  215.  
  216. let fontDown (display : PIButton ) _ =
  217.   curFontIndex <- (curFontIndex - 1)
  218.   if curFontIndex < 0 then curFontIndex <- FontArray.Count - 1
  219.   display.Text <- string curFontIndex
  220.   container.Invalidate()
  221.  
  222. // Implementazione dell'array di glifi
  223. let GlyphArray = new ResizeArray<PIGlyph>()
  224. let defaultLetterSize = SizeF(100.f, 100.f)
  225.  
  226. let nuovaLettera pos =
  227.   let ltr = PIGlyph(FontArray.[curFontIndex], Position=pos, Size=defaultLetterSize, Lettera=letteraSelezionata.[0], CoordinateType=World)
  228.   ltr.Parent <- container
  229.   addLwc2Container container ltr
  230.   GlyphArray.Add(ltr)
  231.   container.Invalidate()
  232.   pos
  233.  
  234. let rimuoviLettera (ltr:LWControl) :unit =
  235.   match ltr with
  236.     | :? PIGlyph as l ->
  237.       ignore (GlyphArray.Remove(l))
  238.       ignore (container.LWControls.Remove(ltr))
  239.     | _ -> ()
  240.  
  241. let letterScale = 1.1f
  242. let letterRotation = 5
  243.  
  244. let animationTimer = new Timer(Interval=10)
  245. do
  246.   animationTimer.Tick.Add(fun _ ->
  247.       for gl in GlyphArray do
  248.         gl.Angle <- (gl.Angle + float32 letterRotation) % float32 360
  249.       container.Invalidate()
  250.     )
  251.  
  252. // Istanzio i pulsanti per i controlli vista
  253. let upButton = PIButton(Position=(btnNumberToPosition 1), Size=squaredBtnSize buttonSide, Text="↑", CoordinateType=View)
  254. upButton.MouseDown.Add(startScrolling ScrollUp)
  255. addLwc2Container container upButton
  256. let downButton = PIButton(Position=(btnNumberToPosition 7), Size=squaredBtnSize buttonSide, Text="↓", CoordinateType=View)
  257. downButton.MouseDown.Add(startScrolling ScrollDown)
  258. addLwc2Container container downButton
  259. let leftButton = PIButton(Position=(btnNumberToPosition 3), Size=squaredBtnSize buttonSide, Text="←", CoordinateType=View)
  260. leftButton.MouseDown.Add(startScrolling ScrollLeft)
  261. addLwc2Container container leftButton
  262. let rightButton = PIButton(Position=(btnNumberToPosition 5), Size=squaredBtnSize buttonSide, Text="→", CoordinateType=View)
  263. rightButton.MouseDown.Add(startScrolling ScrollRight)
  264. addLwc2Container container rightButton
  265. let rotateRightButton = PIButton(Position=(btnNumberToPosition 2), Size=squaredBtnSize buttonSide, Text="R", CoordinateType=View)
  266. rotateRightButton.MouseDown.Add(startRotating RotateRight)
  267. addLwc2Container container rotateRightButton
  268. let rotateLeftButton = PIButton(Position=(btnNumberToPosition 0), Size=squaredBtnSize buttonSide, Text="L", CoordinateType=View)
  269. rotateLeftButton.MouseDown.Add(startRotating RotateLeft)
  270. addLwc2Container container rotateLeftButton
  271. let scaleUpButton = PIButton(Position=(btnNumberToPosition 8), Size=squaredBtnSize buttonSide, Text="+", CoordinateType=View)
  272. scaleUpButton.MouseDown.Add(startScaling ScaleUp)
  273. addLwc2Container container scaleUpButton
  274. let scaleDownButton = PIButton(Position=(btnNumberToPosition 6), Size=squaredBtnSize buttonSide, Text="-", CoordinateType=View)
  275. scaleDownButton.MouseDown.Add(startScaling ScaleDown)
  276. addLwc2Container container scaleDownButton
  277.  
  278. // Istanzio il quadrato per il display della lettera corrente
  279. let currentLetterDisplay = PIButton(Position=(btnNumberToPosition 4), Size=squaredBtnSize buttonSide, Text="A", CoordinateType=View)
  280. addLwc2Container container currentLetterDisplay
  281.  
  282. // Istanzio i pulsanti per il controllo delle lettere
  283. let biggerLetterButton = PIButton(Position=(btnNumberToPosition 12), Size=squaredBtnSize buttonSide, Text="S↑", CoordinateType=View)
  284. biggerLetterButton.MouseDown.Add(fun _ ->
  285.   let control = container.SelectedControl
  286.   match control with
  287.     | :? PIGlyph as ltr  ->
  288.       ltr.Size <- SizeF(letterScale * ltr.Size.Width, letterScale * ltr.Size.Height)
  289.       container.Invalidate()
  290.     | _ -> ()
  291.   )
  292. addLwc2Container container biggerLetterButton
  293. let smallerLetterButton = PIButton(Position=(btnNumberToPosition 13), Size=squaredBtnSize buttonSide, Text="S↓", CoordinateType=View)
  294. smallerLetterButton.MouseDown.Add(fun _ ->
  295.   let control = container.SelectedControl
  296.   match control with
  297.     | :? PIGlyph as ltr  ->
  298.       ltr.Size <- SizeF((1.f/letterScale) * ltr.Size.Width, (1.f/letterScale) * ltr.Size.Height)
  299.       container.Invalidate()
  300.     | _ -> ()
  301.   )
  302. addLwc2Container container smallerLetterButton
  303. let rotateLeftLetterButton = PIButton(Position=(btnNumberToPosition 15), Size=squaredBtnSize buttonSide, Text="R←", CoordinateType=View)
  304. rotateLeftLetterButton.MouseDown.Add(fun _ ->
  305.   let control = container.SelectedControl
  306.   match control with
  307.     | :? PIGlyph as ltr  ->
  308.       ltr.Angle <- (ltr.Angle + float32 letterRotation) % float32 360
  309.       container.Invalidate()
  310.     | _ -> ()
  311.   )
  312. addLwc2Container container rotateLeftLetterButton
  313. let rotateRightLetterButton = PIButton(Position=(btnNumberToPosition 16), Size=squaredBtnSize buttonSide, Text="R→", CoordinateType=View)
  314. rotateRightLetterButton.MouseDown.Add(fun _ ->
  315.   let control = container.SelectedControl
  316.   match control with
  317.     | :? PIGlyph as ltr  ->
  318.       ltr.Angle <- (ltr.Angle - float32 letterRotation)
  319.       if ltr.Angle < 0.f then ltr.Angle <- ltr.Angle + 360.f
  320.       container.Invalidate()
  321.     | _ -> ()
  322.   )
  323. addLwc2Container container rotateRightLetterButton
  324. let animateButton = PIButton(Position=(btnNumberToPosition 17), Size=squaredBtnSize buttonSide, Text="Anim", CoordinateType=View)
  325. animateButton.MouseDown.Add(fun _ ->
  326.   if animationTimer.Enabled then animationTimer.Stop()
  327.   else animationTimer.Start()
  328.   )
  329. addLwc2Container container animateButton
  330. let deleteLetterButton = PIButton(Position=(btnNumberToPosition 14), Size=squaredBtnSize buttonSide, Text="Del", CoordinateType=View)
  331. deleteLetterButton.MouseDown.Add(fun _ ->
  332.   let control = container.SelectedControl
  333.   match control with
  334.     | :? PIGlyph as ltr  ->
  335.       rimuoviLettera control
  336.       container.SelectedControl <- LWControl()
  337.       container.Invalidate()
  338.     | _ -> ()
  339.   )
  340. addLwc2Container container deleteLetterButton
  341.  
  342. // Istanzio il pannello dei font
  343. let currentFontDisplay = PIButton(Position=(btnNumberToPosition 23), Size=squaredBtnSize buttonSide, Text="0", CoordinateType=View)
  344. addLwc2Container container currentFontDisplay
  345. let nextFontButton = PIButton(Position=(btnNumberToPosition 21), Size=squaredBtnSize buttonSide, Text="Fo↑", CoordinateType=View)
  346. nextFontButton.MouseDown.Add(fontUp currentFontDisplay)
  347. addLwc2Container container nextFontButton
  348. let prevFontButton = PIButton(Position=(btnNumberToPosition 22), Size=squaredBtnSize buttonSide, Text="Fo↓", CoordinateType=View)
  349. prevFontButton.MouseDown.Add(fontDown currentFontDisplay)
  350. addLwc2Container container prevFontButton
  351.  
  352. let aggiornaLettera lett =
  353.   letteraSelezionata <- lett
  354.   currentLetterDisplay.Text <- lett
  355.   lett
  356.  
  357. container.UpdateLastLetter <- aggiornaLettera
  358. container.AddNewLetter <- nuovaLettera
  359.  
  360. fin.Text <- "Editor Caratteri - Manini Nicolas"
  361.  
  362. fin.Show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement